构建docker镜像
构建docker镜像
使用docker commit命令创建镜像
使用docker commit创建镜像就类似git的版本管理,创建一个初始容器之后,在这个容器基础上进行修改后commit为一个新的镜像。
[root@localhost docker]# docker run -i -t ubuntu:18.04 /bin/bash
root@5b2cd7392078:/#
root@5b2cd7392078:/# apt-get -yqq update
root@5b2cd7392078:/#
root@5b2cd7392078:/# apt-get -y install apache2
[root@localhost docker]# docker commit 5b2cd7392078 flowpig/u_apache2:v1
sha256:88a0b0add2900a683492047ca0d0fba2ed9d9d12c7c8f6a7f38a03dad178c97a
# 查看刚刚创建容器的ID
[root@localhost docker]# docker ps -l -q
5b2cd7392078
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flowpig/u_apache2 v1 88a0b0add290 18 seconds ago 225MB
[root@localhost docker]# docker images flowpig/u_apache2:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
flowpig/u_apache2 v1 88a0b0add290 About a minute ago 225MB
[root@localhost docker]#
# 基于新创建的镜像构建一个容器
[root@localhost docker]# docker run -i -t flowpig/u_apache2:v1 /bin/bash
使用Dockerfile构建镜像
一般不推荐使用docker commit来构建镜像,推荐使用被称为Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基本的基于DSL语法的指令来构建一个Docker容器,通过Dockerfile构建镜像更具备可重复性、透明性以及幂等性。
[root@localhost soft]# mkdir dc_pro
[root@localhost soft]# cd dc_pro/
[root@localhost dc_pro]# mkdir pro01
[root@localhost dc_pro]# cd pro01/
[root@localhost pro01]# vim Dockerfile
[root@localhost pro01]# cat Dockerfile
FROM ubuntu:18.04
ADD sources.list /root/
RUN sed -i s@deb.debian.org@mirrors.ustc.edu.cn@g /etc/apt/sources.list && sed -i s@security.debian.org@mirrors.ustc.edu.cn@g /etc/apt/sources.list &&apt-get update
RUN apt-get install -y nginx
RUN echo "Hi, I am in your container" \
>/var/www/html/index.nginx-debian.html
EXPOSE 80
[root@localhost pro01]# ls
Dockerfile sources.list
[root@localhost pro01]# docker build . -t="flowpig/u_nginx:v1"
[root@localhost pro01]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
flowpig/u_nginx v1 e134e501e4db 2 minutes ago 189MB
flowpig/u_apache2 v1 88a0b0add290 38 minutes ago 225MB
[root@localhost pro01]# docker run -d -p 80 --name nginx_web flowpig/u_nginx:v1 nginx -g "daemon off;"
7b0383e1765a3eabc3219bbb4cda262c7d5f8c81270fc3e7fc1bfc576d41e8e0
[root@localhost pro01]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b0383e1765a flowpig/u_nginx:v1 "nginx -g 'daemon of…" 39 seconds ago Up 36 seconds 0.0.0.0:32768->80/tcp nginx_web
[root@localhost pro01]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7b0383e1765a flowpig/u_nginx:v1 "nginx -g 'daemon of…" 6 minutes ago Up 6 minutes 0.0.0.0:32768->80/tcp nginx_web
bd3bdfb35d9d 569a26304942 "/bin/bash" 2 hours ago Up 2 hours 80/tcp serene_montalcini
a6084d152773 registry.cn-hangzhou.aliyuncs.com/libin/centos_7.3.1611:1.0 "/bin/bash" 12 days ago Up 12 days stupefied_ellis
[root@localhost pro01]# docker port 7b0383e1765a 80
0.0.0.0:32768
# 指定容器内80端口映射到宿主机8000端口
[root@localhost pro01]# #docker run -d -p 8000:80 --name nginx_web flowpig/u_nginx:v1 nginx -g "daemon off;"
# 绑定到特定的网络接口的指定端口
[root@localhost pro01]# #docker run -d -p 127.0.0.1:8000:80 --name nginx_web flowpig/u_nginx:v1 nginx -g "daemon off;"
# 绑定到特定的网络接口的随机端口
[root@localhost pro01]# #docker run -d -p 127.0.0.1::80 --name nginx_web flowpig/u_nginx:v1 nginx -g "daemon off;"
常用Dcokerfile指令
-
CMD
CMD指令用于指定一个容器启动时要运行的命令。相较于RUN指令不同的是,RUN指令是指定镜像被构建时要运行的命令,而CMD是容器被启动时要运行的命令。
-
WORKDIR
WORKDIR指令用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT或CMD指定的程序会在这个目录下执行。
-
ENV
ENV指令用来在镜像构建过程中设置环境变量,例如:ENV RVM_PATH /home/rvm设置后可以在后续任何RUN指令中使用。
-
USER
USER指令用来指定该镜像会以什么样的用户去运行
-
VOLUME
VOLUME指令用来想基于镜像创建的容器添加卷。一个卷是可以存在于一个或多个容器内的特定的目录,这个目录可以绕过联合文件系统,并提供如下共享数据或者多数据进行持久化的功能。一般用来管理日志和数据库等。
- 卷可以在容器间共享和重用
- 一个容器可以不是必须和其它容器共享卷
- 对卷的修改时即时生效的
- 对卷的修改不会对更新镜像产生影响
- 卷会一直存在直到没有任何容器再使用它
-
ADD
ADD指用来将构建环境下的文件和目录复制到镜像中,ADD指令需要源和目的两个参数。
-
COPY
COPY指令类似于ADD,COPY只关心在构建上下文中复制本地文件而不会去做文件提取和解压的工作。
-
LABEL
LABEL指令用于为Docker镜像添加元数据。元数据以键值对的形式展现。例如:
LABEL version="1.0"
LABEL location="Sichuan" type="DC" role="master"
-
STOPSIGNAL
STOPSIGNAL指令用来设置停止容器时发送什么系统调用信号给容器。这个信号是就是系统内核支持的信号。
-
ARG
ARG指令用来定义可以在docker build命令运行时传递给构建运行时的变量。
-
ONBUILD
ONBUILD指令能为镜像添加触发器。当一个镜像被用做其它镜像的基础镜像时,该镜像中的触发器会被执行。例如:
ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make
推送镜像到Docker Hub
docker login登录,登录地址可以在/etc/docker/daemon.json文件中查看,也可以在命令中指定。登录后的信息在$HOME/.docker/config.json中。
登录后,docker push 镜像名即可推送。

浙公网安备 33010602011771号