构建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 镜像名即可推送。

posted @ 2019-08-19 21:14  村口王铁匠  阅读(176)  评论(0)    收藏  举报