第一本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,该指令复制本地文件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352