用了 Docker 方才以为生产环境终于有了他该有的样子,就像集装箱普及以后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅“官方文档”。本篇为 Docker Engine 的笔记,也就是咱们一般说的 Docker,他包含了提供容器技术实现的 Docker daemon 及终端控制 Docker CLI 的应用程序。后续会继续发布 Docker Compose 和 Docker Swarm 的操做笔记,因为个人绝大部分应用案例都是云服务器,所以 Docker Machine 就略过了。
html
# step 1:安装必要的一些系统工具 apt update apt -y install apt-transport-https ca-certificates curl software-properties-common # step 2:安装 GPG 证书 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - # Step 3:写入软件源信息 add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4:更新并安装 Docker-CE apt -y update apt -y install docker-ce
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://jrzzvzok.mirror.aliyuncs.com"] } EOF systemctl daemon-reload systemctl restart docker
Docker 的架构颇有魅力,他拥有相似于虚拟机性质的隔离机制,但并非严格意义上的虚拟机。我仍是喜欢拿货轮举例,之前咱们是一条小船运一个集装箱的货物,如今能够把 N 个集装箱扔到一条大货轮上。每一个容器(集装箱)共用宿主机(货轮)的内核(运载力),Dockerfile 就像是每一个集装箱中的货物清单和说明书,通常由如下五部分构成:java
FROM <image> FROM <image>:<tag> FROM <image>@<digest>
Docker 的原理基于 Linux 内核的隔离技术,且 Linux From Scratch,所以 FROM scratch
是 docker 中最基础的镜像,debian、ubuntu 和 centos 等都基于 scratch 之上。在实际的运用中,若是必须从零开始搭建镜像的通常都选择 FROM debian
做为基础镜像,不过大多数状况下通常都会以以下:FROM python
、FROM nginx
、FROM java
等为基础镜像。python
MAINTAINER user user@mail.com
。RUN command param1 param2 # 更推荐 RUN ["executable","param1","param2"]
WORKDIR project
。可配合环境变量使用,例:ENV BASEDIR /project WORKDIR $BASEDIR/test
ONBUILD RUN echo "hello world"
“hello world”会在子镜像被构建的过程当中输出。linux
COPY <src> <dest> COPY ["<src>","<dest>"]
ADD rootfs.tar.xz /
。理论上也可添加网络地址,但仍是建议在 RUN 指令中执行 wget 或 curl 命令,感受这样更加可控。实际应用中我喜欢将 COPY 用于文件,ADD 用于目录(仅我我的的使用习惯)。CMD ["executable","param1","param2"] # 更推荐 CMD ["param1","param2"] CMD command param1 param2
若在 docker run 中指定启动命令,则 CMD 将被覆盖。nginx
EXPOSE <port> [<port>...]
,注意此处的暴露端口和docker run 中-p指定的映射端口是两个概念。ENV <key>=<value> ...
。LABEL <key>=<value>...
。USER daemo
。STOPSIGNAL SIGKELL
。SHELL ["bash","-c"]
。为了不喧宾夺主,此处仅摘录我我的操做中较为经常使用的命令。docker
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
,参数说明:-d , --detach # 后台运行 -it, --interactive tty # 交互终端形式运行 -p , --publish list # 指定端口 -v , --volume list # 挂载存储卷 --name string # 定义名字 --rm # 容器终止后自动删除(不支持在后台运行的容器) --restart string # no、on-failure(非正常退出时重启,on-failure:3 最多重启三次)、always、unless-stopped
docker run 的参数甚多,可经过 --help
查询,后续这些复杂的配置都会移交给 Docker Compose,以上几个足以应用70%~80%的场景,例:shell
# 相似 ubuntu 这类容器必须以 -it 交互终端形式运行,不然没法在后台保留 docker run -it -d --name my-ubuntu ubuntu
# 端口映射和挂载数据卷 docker run -d \ -p 8080:80 \ -v /data/www:/usr/share/nginx/html\ --name my-nginx nginx
docker start/stop/restart my-container
。docker rm [OPTIONS] CONTAINER [CONTAINER...]
,参数说明:-f, --force Force the removal of a running container -l, --link Remove the specified link -v, --volumes Remove the volumes associated with the container
docker exec -it my-nginx bash
。docker ps -anq
,参数说明:all、n last(最新 n 个容器)、quiet(只显示容器编号)。docker top my-container
。docker logs -f --tail
,参数说明:follow、--tail n(最新条日志)。docker port my-container
。docker login [OPTIONS] [SERVER] docker logout [SERVER]
若是是Docker Hub,则示例以下:json
docker login -u username -p passward docker logout
在生产环境中,咱们通常会选择使用云厂商的镜像仓库,例:ubuntu
docker login -u yo****@qq.com -p ****** registry-vpc.cn-hangzhou.aliyuncs.com docker logout registry-vpc.cn-hangzhou.aliyuncs.com
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
。docker push [OPTIONS] NAME[:TAG]
。docker images -q
,参数说明:quiet(只显示image Id)。docker rmi -f
,参数说明:force。docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
,例:docker tag ubuntu youclk/my-ubuntu:v1
。docker build [OPTIONS] PATH | URL | -
,参数说明:-t tag 例:docker build -t youclk/my-ubuntu:v1 .
。静夜听钟却念念不安,举首相望,恐知者惟灯而~ 哀哉!整理至此,小弟拙笔盼君悦之。centos
个人公众号《有刻》,咱们共同成长!