回音壁


一切爆发都有片刻的宁静/一切死亡都有冗长的回声


Docker

安装docker

1
2
3
4
5
6
7
8
9
$ sudo apt install linux-image-extra-virtual
$ sudo apt install linux-image-generic
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ sudo apt install docker
$ sudo apt install docker.io
$ sudo docker run hello-world
#获取镜像
$ sudo docker pull ubuntu:1604
$ sudo systemctl restart docker

运行docker镜像

1
2
3
4
5
6
7
8
9
10
$ sudo docker run -it --rm ubuntu:16.04 bash
#查看镜像列表
$ docker image ls
$ docker image ls ubuntu
$ docker image ls --format "{{.ID}}: {{.Repository}}"
#删除镜像
$ docker image rm $(docker image ls -q redis)
#启动一个容器
$ docker run --name webserver1 -d -p 81:80 nginx
$ docker exec -it webserver1 bash

Dockerfile(shell/exec)

shell 格式:RUN <命令>
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM debian:jessie

RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \
&& mkdir -p /usr/src/redis \
&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm redis.tar.gz \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps

使用dockerfile构建镜像

docker build [选项] <上下文路径/URL/->

1
2
3
4
5
6
7
8
9
$ docker build -t nginx:v3 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c

Dockerfile指令

COPY

  • COPY <源路径>… <目标路径>
  • COPY [“<源路径1>”,… “<目标路径>”]

将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

ADD

所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD

CMD

shell 格式:CMD <命令>
exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…]
参数列表格式:CMD [“参数1”, “参数2”…]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
CMD 指令就是用于指定默认的容器主进程的启动命令的。

ENTRYPOINT

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过 docker run 的参数 –entrypoint 来指定。

ENV

设置环境变量

ARG

构建参数

VLOUME定义匿名卷

VOLUME [“<路径1>”, “<路径2>”…]
VOLUME /data
这里的 /data 目录就会在运行时自动挂载为匿名卷,任何向 /data 中写入的信息都不会记录进容器存储层,从而保证了容器存储层的无状态化

EXPOSE

要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射

USER

切换用户

HEALTHCHECK

通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。

ONBUILD

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#从一个镜像新建容器
docker run --name webserver -tid ubuntu:16.04
#启动已终止容器
docker container start webserver
#停止运行的容器
docker container stop webserver
#查看容器列表
docker container ls -a
#查看容器输出日志
docker container logs webserver
#进入容器
docker exec -ti webserver bash
#导出容器
docker export [ID] > ubuntu.tar
#导入容器到镜像库
cat ubuntu.tar | docker import - test/ubuntu:v1.0
#删除容器
docker container rm webserver
#删除所有容器
docker prune

数据卷

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#创建数据卷
docker volume create my-vol
#查看数据卷信息
docker volume inspect my-vol
#查看容器信息
docker inspect webserver
#删除数据卷
docker volume rm my-vol
docker volume prune
#挂载数据卷到容器中
docker run -d -P --name web --mount source=my-vol,target=/webapp ubuntu python app.py
docker run -d -P -v my-vol:/webapp ubuntu python app.py
#挂载本机文件作为数据卷
docker run --rm -ti --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history ubuntu bash

sudo apt install inetutils-ping