用了 Docker 方才觉得生产环境终于有了他该有的样子,就像集装箱普及之后大型货轮的价值才逐渐体现出来,Docker 详细说明可查阅“官方文档”。本篇为 Docker Engine 的笔记,也就是我们通常说的 Docker,他包含了提供容器技术实现的 Docker daemon 及终端控制 Docker CLI 的应用程序。后续会继续发布 Docker Compose 和 Docker Swarm 的操作笔记,由于我的绝大部分应用案例都是云服务器,因此 Docker Machine 就略过了。
# 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 就像是每个集装箱中的货物清单和说明书,一般由以下五部分构成:
FROM scratch
是 docker 中最基础的镜像,debian、ubuntu 和 centos 等都基于 scratch 之上。在实际的运用中,如果必须从零开始搭建镜像的一般都选择 FROM debian
作为基础镜像,不过大多数情况下一般都会以如下:FROM python
、FROM nginx
、FROM java
等为基础镜像。MAINTAINER user user@mail.com
。WORKDIR project
。可配合环境变量使用,例:
ENV BASEDIR /project WORKDIR $BASEDIR/testADD rootfs.tar.xz /
。理论上也可添加网络地址,但还是建议在 RUN 指令中执行 wget 或 curl 命令,感觉这样更加可控。实际应用中我喜欢将 COPY 用于文件,ADD 用于目录(仅我个人的使用习惯)。EXPOSE <port> [<port>...]
,注意此处的暴露端口和docker run 中-p指定的映射端口是两个概念。ENV <key>=<value> ...
。LABEL <key>=<value>...
。USER daemo
。STOPSIGNAL SIGKELL
。SHELL ["bash","-c"]
。为了避免喧宾夺主,此处仅摘录我个人操作中较为常用的命令。
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%的场景,例:
# 类似 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 nginxdocker 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 containerdocker 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 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 .
。静夜听钟却念念不安,举首相望,恐知者唯灯而~ 哀哉!整理至此,小弟拙笔盼君悦之。