第一本docker书-3.docker镜像和仓库

什么是docker镜像

  docker镜像是用来启动容器的构建基石,docker中镜像的结构如下所示,一个镜像放在另一个镜像顶部,当从一个镜像启动容器时,docker会在该镜像的最顶层加载一个读写文件系统。

docker文件系统层.png

  当docker第一次启动一个容器时,初始的读写层是空的,当文件系统发生变化时,这些变化都会应用到这一层上,比如想要修改一个文件,首先会从该读写层下面的只读层复制到该读写层,该文件的只读版本仍然存在,只是被读写层的副本多隐藏,这种机制被称为写时复制(copy on write)。
  写时复制:每个只读镜像层都是只读的,并且以后永远不会变化。当创建一个新容器时,docker会构建出一个镜像栈,并在栈顶端添加一个读写层。这个读写层再加上下面的镜像层及一些数据构成了一个容器。

镜像相关操作

列出镜像

可以通过docker images命令列出镜像列表

apple@appledeMacBook-Pro ~ % docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              1d622ef86b13        3 weeks ago         73.9MB

拉取镜像

使用docker pull命令可以拉取镜像到本地,如下所示。

apple@appledeMacBook-Pro ~ % docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
afb6ec6fdc1c: Pull complete 
0bdc5971ba40: Pull complete 
97ae94a2c729: Pull complete 
f777521d340e: Pull complete 
1393ff7fc871: Pull complete 
a499b89994d9: Pull complete 
7ebe8eefbafe: Pull complete 
597069368ef1: Pull complete 
ce39a5501878: Pull complete 
7d545bca14bf: Pull complete 
0f5f78cccacb: Pull complete 
623a5dae2b42: Pull complete 
Digest: sha256:beba993cc5720da07129078d13441745c02560a2a0181071143e599ad9c497fa
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
apple@appledeMacBook-Pro ~ % docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mysql               latest              94dff5fab37f        37 hours ago        541MB
ubuntu              latest              1d622ef86b13        3 weeks ago         73.9MB

查找镜像

通过docker search命令可以查找所欲Docker Hub上公共的可以用镜像,如下所示:

apple@appledeMacBook-Pro ~ % docker search redis
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                            Redis is an open source key-value store that…   8178                [OK]                
bitnami/redis                    Bitnami Redis Docker Image                      145                                     [OK]
sameersbn/redis                                                                  80                                      [OK]
...
  • NAME:仓库名
  • DESCRIPTION:镜像描述
  • STARS:获得stars的数量(受欢迎程度)
  • OFFICIAL:是否官方
  • AUTOMATED:表示这个镜像是由Docker Hub自动构建流程创建的

构建镜像

主要记录使用dockerfile构建镜像,dockerfile使用DSL语法的指令来构建一个docker镜像,之后使用docker build构建一个新的镜像。
新建一个Dockerfile文件,如下所示:

# Version: 0.0.1
FROM ubuntu
MAINTAINER Ma Ning "maning_star@126.com"
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'hi, hello world' \
        >/usr/share/nginx/html/index.html
EXPOSE 80

该Dockerfile文件由一系列指令和参数组成,每条指令必须为大写字母,且后面要跟随一个参数,指令是从上到下执行,每条指令都会创建一个新的镜像层并对镜像进行提交。

  • 每个Dockerfile的第一条指令都应该是FROM,其指定一个已经存在的镜像,后续指令均基于该镜像,这个镜像被称为基础镜像
  • MAINTAINER指令用于标注镜像所有者及联系方式
  • 接下来的三条RUN指令用于在当前镜像中运行指定的命令
  • 接着EXPOSE指令告诉docker容器内的应用程序会使用容器的指定端口
    接下来就是构建镜像,如下所示:
apple@appledeMacBook-Pro dockerfile_study % docker build -t maning:v1.0 .

Sending build context to Docker daemon  14.85kB
Step 1/6 : FROM ubuntu
 ---> 1d622ef86b13
Step 2/6 : MAINTAINER MA Ning "maning_star@126.com"
 ---> Using cache
 ---> 1d845767272e
Step 3/6 : RUN apt-get update
 ---> Running in 0e189e8c645c
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [107 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal InRelease [265 kB]
Get:3 http://security.ubuntu.com/ubuntu focal-security/universe amd64 Packages [35.7 kB]
Get:4 http://security.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [9726 B]
Get:5 http://security.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [1079 B]
Get:6 http://security.ubuntu.com/ubuntu focal-security/main amd64 Packages [95.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal-updates InRelease [107 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal-backports InRelease [98.3 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages [1275 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal/multiverse amd64 Packages [177 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/universe amd64 Packages [11.3 MB]
Get:12 http://archive.ubuntu.com/ubuntu focal/restricted amd64 Packages [33.4 kB]
Get:13 http://archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [9726 B]
Get:14 http://archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [1079 B]
Get:15 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [164 kB]
Get:16 http://archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [88.4 kB]
Get:17 http://archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [2903 B]
Fetched 13.8 MB in 3min 15s (71.0 kB/s)
Reading package lists...
Removing intermediate container 0e189e8c645c
 ---> 41f6d7db95a0
Step 4/6 : RUN apt-get install -y nginx
 ---> Running in 27c3ae37a573
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2
  libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66
  libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter
  libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream
  libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data
  libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12
  nginx-common nginx-core tzdata ucf
Suggested packages:
  iproute2-doc libgd-tools fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
  fontconfig-config fonts-dejavu-core iproute2 libatm1 libbsd0 libcap2
  libcap2-bin libelf1 libexpat1 libfontconfig1 libfreetype6 libgd3 libicu66
  libjbig0 libjpeg-turbo8 libjpeg8 libmnl0 libnginx-mod-http-image-filter
  libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream
  libpam-cap libpng16-16 libssl1.1 libtiff5 libwebp6 libx11-6 libx11-data
  libxau6 libxcb1 libxdmcp6 libxml2 libxpm4 libxslt1.1 libxtables12 nginx
  nginx-common nginx-core tzdata ucf
0 upgraded, 40 newly installed, 0 to remove and 4 not upgraded.
Need to get 15.8 MB of archives.
After this operation, 60.8 MB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu focal/main amd64 libbsd0 amd64 0.10.0-1 [45.4 kB]
Get:2 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2 amd64 1:2.32-1 [15.9 kB]
Get:3 http://archive.ubuntu.com/ubuntu focal/main amd64 libelf1 amd64 0.176-1.1build1 [44.0 kB]
Get:4 http://archive.ubuntu.com/ubuntu focal/main amd64 libmnl0 amd64 1.0.4-2 [12.3 kB]
Get:5 http://archive.ubuntu.com/ubuntu focal/main amd64 libxtables12 amd64 1.8.4-3ubuntu2 [28.4 kB]
Get:6 http://archive.ubuntu.com/ubuntu focal/main amd64 libcap2-bin amd64 1:2.32-1 [26.2 kB]
Get:7 http://archive.ubuntu.com/ubuntu focal/main amd64 iproute2 amd64 5.5.0-1ubuntu1 [858 kB]
Get:8 http://archive.ubuntu.com/ubuntu focal/main amd64 libatm1 amd64 1:2.5.1-4 [21.8 kB]
Get:9 http://archive.ubuntu.com/ubuntu focal/main amd64 libexpat1 amd64 2.2.9-1build1 [73.3 kB]
Get:10 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 tzdata all 2020a-0ubuntu0.20.04 [293 kB]
Get:11 http://archive.ubuntu.com/ubuntu focal/main amd64 libicu66 amd64 66.1-2ubuntu2 [8520 kB]

命令为docker build,使用-t参数为新镜像设置了名称及版本号,一定不要忽略最后的".",其表示在当前路径下的Dockerfile文件。

Dockerfile指令

  • CMD

该指令用于指定一个容器启动时要运行的命令,类似RUN,区别在于RUN是指定镜像被构建时要运行的命令,而CMD时指定容器启动时要运行的命令。

docker run -it mysql /bin/true
// 等效于
CMD ["/bin/true"]
  • ENTRYPOINT

ENTRYPOINT与CMD非常类似,不同之处在晕docker run命令行会覆盖CMD,而对于ENTRYPOINT,docker run命令行的指定参数会被当做参数传递给ENTRYPOINT指令中指定的命令

  • WORKDIR

该指令用来从镜像创建一个新容器时,在容器内部设置一个工作目录

  • ENV

该指令用来在镜像构建国产中设置环境变量

  • USER

该指令用来指定镜像会以什么样的用户去运行

  • VOLUME

该指令用来向基于镜像创建的容器添加卷

  • ADD

ADD指令用来构建环境下的文件和目录复制到镜像中,如下所示

ADD xxx /opt/application/xxx

此处会将构建目录下的文件复制到镜像中的/opt/application/位置

  • COPY

COPY类似ADD,该指令复制本地文件

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。