安装docker
1 | $ sudo apt install linux-image-extra-virtual |
运行docker镜像
1 | $ sudo docker run -it --rm ubuntu:16.04 bash |
Dockerfile(shell/exec)
shell 格式:RUN <命令>
exec 格式:RUN [“可执行文件”, “参数1”, “参数2”]1
2
3
4
5
6
7
8
9
10
11
12
13
14FROM 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 | #从一个镜像新建容器 |
数据卷
1 | #创建数据卷 |
sudo apt install inetutils-ping