您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
07-Dockerfile详解
发布时间:2020-09-13 18:32:06编辑:雪饮阅读()
变量的缺省值
[root@localhost ~]# echo ${NAME:-tom}
tom
[root@localhost ~]# NAME=jerry
[root@localhost ~]# echo ${NAME:-tom}
Jerry
即变量不存在或者没有值的时候才呈现为我们设定的缺省值
变量的计算属性
[root@localhost ~]# NAME=jerry
[root@localhost ~]# echo ${NAME:+tom}
tom
[root@localhost ~]# NAME=
[root@localhost ~]# echo ${NAME:+tom}
这里可以总结为只有变量存在或有值的时候才会呈现为我们设定的值
基于Dockerfile创建docker镜像
首先我们创建一个目录
[root@localhost ~]# mkdir img1
建立好目录后这里为什么要cd,其实我觉得可以不用cd直接从工作目录指定到该目录执行操作也行吧,不过我没有尝试过
[root@localhost ~]# cd img1
建立好目录后我们这里假定要打包一个index.html到这个docker镜像中,所以该目录我们还要建立一个index.html
[root@localhost img1]# vi index.html
[root@localhost img1]# cat index.html
this is index
建立docker镜像就是要在这个目录中存在有Dockerfile文件,类似make install要先通过make生成那个makefile一样才能执行,这里Dockerfile则也是必不可少的。
这个Dockerfile中#符号不用说是注释,而FROM则是指定本次制作镜像是基于其它某个镜像的,MAINTAINER这个则一看就明白类似声明作者的信息,COPY命令则是从宿主机当前目录拷贝文件到我们即将制作的镜像中的指定路径的,当然这个指定路径我感觉是可以不存在的会自动创建的,而这里则拷贝了上面我们建立的index.html文件
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
有了Dockerfile文件后那么我们就可以制作镜像了,这里的build命令就是制作镜像的,-t则是声明该镜像的名称以及tag,路径当然是./因为我们就在这个镜像制作的工作目录
[root@localhost img1]# docker build -t tinyhttpd:v0.1-1 ./
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM busybox:latest
---> 018c9d7b792b
Step 2/3 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Running in c86a9f05fa74
---> 1ed40385330f
Removing intermediate container c86a9f05fa74
Step 3/3 : COPY index.html /data/web/html/
---> cfc2056bdbee
Removing intermediate container d18366437689
Successfully built cfc2056bdbee
可以看到我们创建成功了
[root@localhost img1]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.1-1 cfc2056bdbee 12 minutes ago 1.22 MB
registry.cn-qingdao.aliyuncs.com/towards/httpd v0.2 023aaf0a80ce 13 days ago 1.22 MB
towards/httpd v0.2 023aaf0a80ce 13 days ago 1.22 MB
foe/httpd v0.2 a2dbea494573 13 days ago 1.22 MB
foe/httpd v0.1-1 f0f7ae2f4223 13 days ago 1.22 MB
docker.io/busybox latest 018c9d7b792b 6 weeks ago 1.22 MB
docker.io/redis 4-alpine e3dd0e49bca5 4 months ago 20.4 MB
docker.io/nginx 1.14-alpine 8a2fb25a19f5 17 months ago 16 MB
看完即删
我们上面创建了新镜像,为了验证我们刚才从宿主机上面拷贝的那个index.html是否存在,我们执行下面命令
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-1 cat /data/web/html/index.html
this is index
可以看到的确是存在刚才拷贝的那个index.html
而且这里我们用的命令并不是exec形式也不是进入控制台进行查看然后exit命令退出,像这种直接后面跟着一个命令执行结束后该docker容器的生命周期就结束了,我个人在这里称之为看完即删
打包yum.repos.d
接下来我们要将下面这些文件也要拷贝到我们的镜像中
[root@localhost img1]# cp -r /etc/yum.repos.d/ ./
[root@localhost img1]# ls
Dockerfile index.html yum.repos.d
则
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
然后再次制作
[root@localhost img1]# docker build -t tinyhttpd:v0.1-2 ./
Sending build context to Docker daemon 26.62 kB
Step 1/4 : FROM busybox:latest
---> 018c9d7b792b
Step 2/4 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/4 : COPY index.html /data/web/html/
---> Using cache
---> cfc2056bdbee
Step 4/4 : COPY yum.repos.d /etc/yum.repos.d/
---> 68ace65afdf4
Removing intermediate container 156c1ea1dfbd
Successfully built 68ace65afdf4
然后可以看到也成功把刚才这个yum.repos.d打包进去了
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-2 ls /etc/yum.repos.d/
CentOS-Base.repo
CentOS-Base.repo.d
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
CentOS-fasttrack.repo
CentOS-x86_64-kernel.repo
Add支持网络路径
我们上面通过COPY从宿主机拷贝文件到我们制作的镜像中,那么如果我要从一个网络路径中拷贝到我们制作的镜像中COPY就搞不定了,而ADD则支持
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/
然后我们再次制作镜像
[root@localhost img1]# docker build -t tinyhttpd:v0.1-3 ./
Sending build context to Docker daemon 26.62 kB
Step 1/5 : FROM busybox:latest
---> 018c9d7b792b
Step 2/5 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/5 : COPY index.html /data/web/html/
---> Using cache
---> cfc2056bdbee
Step 4/5 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 68ace65afdf4
Step 5/5 : ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/local/src/
Downloading [==================================================>] 1.026 MB/1.026 MB
---> 59349c3f6a5c
Removing intermediate container 8d3cf9800891
Successfully built 59349c3f6a5c
我们可以看到网络中的这个文件也被我们打包进了我们制作的镜像中了
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src
nginx-1.15.2.tar.gz
本地add
这次我们先将刚才这个网络中的文件nginx下载到本地
[root@localhost img1]# yum install wget
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager
This system is not registered with an entitlement server. You can use subscription-manager to register.
Determining fastest mirrors
* base: mirrors.ustc.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.ustc.edu.cn
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
Resolving Dependencies
--> Running transaction check
---> Package wget.x86_64 0:1.14-18.el7_6.1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=====================================================================================================================
Package Arch Version Repository Size
=====================================================================================================================
Installing:
wget x86_64 1.14-18.el7_6.1 base 547 k
Transaction Summary
=====================================================================================================================
Install 1 Package
Total download size: 547 k
Installed size: 2.0 M
Is this ok [y/d/N]: y
Downloading packages:
wget-1.14-18.el7_6.1.x86_64.rpm | 547 kB 00:00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : wget-1.14-18.el7_6.1.x86_64 1/1
Verifying : wget-1.14-18.el7_6.1.x86_64 1/1
Installed:
wget.x86_64 0:1.14-18.el7_6.1
Complete!
[root@localhost img1]# wget http://nginx.org/download/nginx-1.15.2.tar.gz
--2020-09-13 04:51:09-- http://nginx.org/download/nginx-1.15.2.tar.gz
Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5704::6, ...
Connecting to nginx.org (nginx.org)|3.125.197.172|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1025746 (1002K) [application/octet-stream]
Saving to: ‘nginx-1.15.2.tar.gz’
8% [=========> ] 87,557 --.-K/s in 59s
2020-09-13 04:52:10 (1.44 KB/s) - Read error at byte 87557/1025746 (Connection reset by peer). Retrying.
--2020-09-13 04:52:11-- (try: 2) http://nginx.org/download/nginx-1.15.2.tar.gz
Connecting to nginx.org (nginx.org)|3.125.197.172|:80... connected.
HTTP request sent, awaiting response... 206 Partial Content
Length: 1025746 (1002K), 938189 (916K) remaining [application/octet-stream]
Saving to: ‘nginx-1.15.2.tar.gz’
100%[++++++++++====================================================================================================================>] 1,025,746 20.1KB/s in 40s
2020-09-13 04:52:51 (23.2 KB/s) - ‘nginx-1.15.2.tar.gz’ saved [1025746/1025746]
那么我们重新修改下刚才的ADD
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
ADD nginx-1.15.2.tar.gz /usr/local/src/
然后再次重新制作镜像
[root@localhost img1]# docker build -t tinyhttpd:v0.1-4 ./
Sending build context to Docker daemon 1.053 MB
Step 1/5 : FROM busybox:latest
---> 018c9d7b792b
Step 2/5 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/5 : COPY index.html /data/web/html/
---> Using cache
---> cfc2056bdbee
Step 4/5 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 68ace65afdf4
Step 5/5 : ADD nginx-1.15.2.tar.gz /usr/local/src/
---> e437049ebf9f
Removing intermediate container b8c34e54bd75
Successfully built e437049ebf9f
然后可以看到基于本地的ADD出来的刚才这个tar.gz文件就会被自动释放
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src
nginx-1.15.2
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src/nginx-1.15.2
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
工作目录及卷
上面上面在编写Dockerfile文件时拷贝文件到目标路径时用的是绝对路径,写起来有点繁琐,而能指定基础工作目录则会缩略下路径,下面实例演示了变更工作目录的用法。另外我们制作镜像时也没有指定过卷,下面实例就一并把指定卷的用法演示。VOLUME就是指定卷的语法、WORKDIR就是变更工作目录的语法
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD nginx-1.15.2.tar.gz ./src/
VOLUME /data/mysql/
那么我们再次制作镜像,我们可以看到我们制作镜像过程中我们刚才指定的卷就已经在开始挂载了。
[root@localhost img1]# docker build -t tinyhttpd:v0.1-5 ./
Sending build context to Docker daemon 1.053 MB
Step 1/7 : FROM busybox:latest
---> 018c9d7b792b
Step 2/7 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/7 : COPY index.html /data/web/html/
---> Using cache
---> cfc2056bdbee
Step 4/7 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 68ace65afdf4
Step 5/7 : WORKDIR /usr/local/
---> 659874f0e20f
Removing intermediate container 84235d395677
Step 6/7 : ADD nginx-1.15.2.tar.gz ./src/
---> 6ae96cb647c3
Removing intermediate container b087a2f01a58
Step 7/7 : VOLUME /data/mysql/
---> Running in c960b09d7e8c
---> 6424f38bf127
Removing intermediate container c960b09d7e8c
Successfully built 6424f38bf127
然后我们看看我们挂载的卷,可以看到的确有挂载的
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-5 mount
rootfs on / type rootfs (rw)
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/l/LLFITURGZOSYKUOZ44K5TPEV3M:/var/lib/docker/overlay2/l/V4E7R4QIXNVLTDPBA3VQPAETNL:/var/lib/docker/overlay2/l/EDJJQMP6Z7TUCQFTGWYU2SINBW:/var/lib/docker/overlay2/l/IYAG3QCDMS3ZL2UFDW6TEURWRC:/var/lib/docker/overlay2/l/4IFSRXRHYLYOSZQQBTMY2BZTCS:/var/lib/docker/overlay2/l/UXXZDEWBS2D2HH7XFF54C45C4G,upperdir=/var/lib/docker/overlay2/6939fa026e81ee390353bac406e12a06d6165580a96b77471188104cbc01fdc9/diff,workdir=/var/lib/docker/overlay2/6939fa026e81ee390353bac406e12a06d6165580a96b77471188104cbc01fdc9/work)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,nosuid,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=666)
sysfs on /sys type sysfs (ro,nosuid,nodev,noexec,relatime)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,relatime,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (ro,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (ro,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/perf_event type cgroup (ro,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/freezer type cgroup (ro,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (ro,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/net_prio,net_cls type cgroup (ro,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (ro,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/cpuacct,cpu type cgroup (ro,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/pids type cgroup (ro,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (ro,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (ro,nosuid,nodev,noexec,relatime,memory)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
/dev/mapper/cl-root on /data/mysql type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/cl-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/cl-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/cl-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=65536k)
/dev/mapper/cl-root on /run/secrets type xfs (rw,relatime,attr2,inode64,noquota)
proc on /proc/asound type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/bus type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/fs type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/irq type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sys type proc (ro,nosuid,nodev,noexec,relatime)
proc on /proc/sysrq-trigger type proc (ro,nosuid,nodev,noexec,relatime)
tmpfs on /proc/acpi type tmpfs (ro,relatime)
tmpfs on /proc/kcore type tmpfs (rw,nosuid,mode=755)
tmpfs on /proc/keys type tmpfs (rw,nosuid,mode=755)
tmpfs on /proc/timer_list type tmpfs (rw,nosuid,mode=755)
tmpfs on /proc/timer_stats type tmpfs (rw,nosuid,mode=755)
tmpfs on /proc/sched_debug type tmpfs (rw,nosuid,mode=755)
tmpfs on /proc/scsi type tmpfs (ro,relatime)
tmpfs on /sys/firmware type tmpfs (ro,relatime)
这里我们还可以查看inspect的信息,当然了马哥老师又在这里秀了下sleep的用法
[root@localhost img1]# docker run --name tinyweb1 tinyhttpd:v0.1-5 sleep 60
这里让docker容器休眠的过程中,同时我们另外一个会话就可以查看他的inspect信息了,这里我的理解是休眠60后就会自动删除该容器,而我们要查看inspect信息也就必须在这60的时间内完成
那么当我们查看到inspect中的mouts中的source和destination的信息就再次知道我们的卷也是挂载成功了的,因此只要你镜像中有存储卷,那么你创建容器时候无需-v也能自动挂载存储卷。
[root@localhost ~]# docker inspect tinyweb1
[
{
"Id": "d25150056350d5631c09316abbe6e1161522b9e64468793c061b4658ddc90464",
"Created": "2020-09-13T09:19:48.445333711Z",
"Path": "sleep",
"Args": [
"60"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2585,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-09-13T09:19:48.639273807Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:6424f38bf1278397b5007d66cb2e37b7c29ddcae884aff6e579907f360a32bde",
"ResolvConfPath": "/var/lib/docker/containers/d25150056350d5631c09316abbe6e1161522b9e64468793c061b4658ddc90464/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/d25150056350d5631c09316abbe6e1161522b9e64468793c061b4658ddc90464/hostname",
"HostsPath": "/var/lib/docker/containers/d25150056350d5631c09316abbe6e1161522b9e64468793c061b4658ddc90464/hosts",
"LogPath": "",
"Name": "/tinyweb1",
"RestartCount": 0,
"Driver": "overlay2",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "journald",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "docker-runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/016fd48a3c7fb550371210af850d46a02d6dfebcc1069280a82a21f6925f2756-init/diff:/var/lib/docker/overlay2/94cf8bf0b942ee91b7cc5112973f3010812cbe9eb239c96a2cee59eb155ee8d1/diff:/var/lib/docker/overlay2/941f3b8cf70c8b97f80548f869037918307d401732625ab2b8a3cb1b57ae70b1/diff:/var/lib/docker/overlay2/9d7d10c85c5cdd6941910ec83daaa9ce407f5ec72f72c15b72beef8127c7355f/diff:/var/lib/docker/overlay2/0b4a214bd307b07e8a3daec5b386bde01a2b416d27bf73a845e6c3b06aba2039/diff:/var/lib/docker/overlay2/c85fc5ddc2b05c93c6b2682475a635ef62a7d615bafe9b740e81b969d6e6167d/diff",
"MergedDir": "/var/lib/docker/overlay2/016fd48a3c7fb550371210af850d46a02d6dfebcc1069280a82a21f6925f2756/merged",
"UpperDir": "/var/lib/docker/overlay2/016fd48a3c7fb550371210af850d46a02d6dfebcc1069280a82a21f6925f2756/diff",
"WorkDir": "/var/lib/docker/overlay2/016fd48a3c7fb550371210af850d46a02d6dfebcc1069280a82a21f6925f2756/work"
}
},
"Mounts": [
{
"Type": "volume",
"Name": "55d7e333bceb672901b136aa63056038885aa5858dc3453f277af0ed7f094611",
"Source": "/var/lib/docker/volumes/55d7e333bceb672901b136aa63056038885aa5858dc3453f277af0ed7f094611/_data",
"Destination": "/data/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "d25150056350",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"sleep",
"60"
],
"Image": "tinyhttpd:v0.1-5",
"Volumes": {
"/data/mysql/": {}
},
"WorkingDir": "/usr/local",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "35a1676c28646b86a838463272a23e52350e497d0c9efc78994fc2edb386e174",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/35a1676c2864",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "c0f44683be9a7203ce29ab8c37a0448ae9af120f42189c831a8f226f102d884d",
"Gateway": "10.0.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "10.0.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:0a:00:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "cfba3aa172b563b1554c48c3724cf2cf12cffb4f6df2d4196a3980e9d5a0c6f3",
"EndpointID": "c0f44683be9a7203ce29ab8c37a0448ae9af120f42189c831a8f226f102d884d",
"Gateway": "10.0.0.1",
"IPAddress": "10.0.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:0a:00:00:02"
}
}
}
}
]
那么接下来我们再来确认下我们刚才利用工作目录变更WORKDIR命令拷贝的文件,会发现也是ok的
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-5 ls /usr/local/src/
nginx-1.15.2
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-5 ls /usr/local/src/nginx-1.15.2
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
制作镜像时默认动态暴露端口
上面我们制作镜像时并没有玩过暴露端口,之前曾经说过镜像中若有指定端口暴露,则即便是动态暴露,那么对于宿主机访问该容器来说指定的端口是多少则直接就暴露给宿主机可直接访问而非动态获取。而EXPOSE语法就是可以在Dockerfile中进行端口暴露的。
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
COPY index.html /data/web/html/
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD nginx-1.15.2.tar.gz ./src/
VOLUME /data/mysql/
EXPOSE 80/tcp
那么我们再次制作镜像哈
[root@localhost img1]# docker build -t tinyhttpd:v0.1-6 ./
Sending build context to Docker daemon 1.053 MB
Step 1/8 : FROM busybox:latest
---> 018c9d7b792b
Step 2/8 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/8 : COPY index.html /data/web/html/
---> Using cache
---> cfc2056bdbee
Step 4/8 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 68ace65afdf4
Step 5/8 : WORKDIR /usr/local/
---> Using cache
---> 659874f0e20f
Step 6/8 : ADD nginx-1.15.2.tar.gz ./src/
---> Using cache
---> 6ae96cb647c3
Step 7/8 : VOLUME /data/mysql/
---> Using cache
---> 6424f38bf127
Step 8/8 : EXPOSE 80/tcp
---> Running in 388b772cdf65
---> 7da801c267b2
Removing intermediate container 388b772cdf65
Successfully built 7da801c267b2
然后我们用该镜像开启一个httpd服务,当然是前台的,-f(front前面,正面)指定httpd服务运行于前台。
[root@localhost img1]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-6 /bin/httpd -f -h /data/web/html
既然是前台,所以我们就必须重新开一个会话来查看inspect信息
[root@localhost ~]# docker inspect tinyweb1
[
{
"Id": "c6b138a78aca5671b6fdd0b3889a764a8830a05776e9c53b55b535ca6c38a53c",
"Created": "2020-09-13T09:31:21.095515655Z",
"Path": "/bin/httpd",
"Args": [
"-f",
"-h",
"/data/web/html"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2912,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-09-13T09:31:21.297378439Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:7da801c267b225494187d2a34f1fca41f0b0fa92697e85dad6e5c14fbce880a9",
"ResolvConfPath": "/var/lib/docker/containers/c6b138a78aca5671b6fdd0b3889a764a8830a05776e9c53b55b535ca6c38a53c/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/c6b138a78aca5671b6fdd0b3889a764a8830a05776e9c53b55b535ca6c38a53c/hostname",
"HostsPath": "/var/lib/docker/containers/c6b138a78aca5671b6fdd0b3889a764a8830a05776e9c53b55b535ca6c38a53c/hosts",
"LogPath": "",
"Name": "/tinyweb1",
"RestartCount": 0,
"Driver": "overlay2",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "journald",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": true,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "docker-runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": null,
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DiskQuota": 0,
"KernelMemory": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": -1,
"OomKillDisable": false,
"PidsLimit": 0,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0
},
"GraphDriver": {
"Name": "overlay2",
"Data": {
"LowerDir": "/var/lib/docker/overlay2/8e886a7aad3604683346553ddf69aee84ef4a2b61ab437d23cb12be182c899d2-init/diff:/var/lib/docker/overlay2/94cf8bf0b942ee91b7cc5112973f3010812cbe9eb239c96a2cee59eb155ee8d1/diff:/var/lib/docker/overlay2/941f3b8cf70c8b97f80548f869037918307d401732625ab2b8a3cb1b57ae70b1/diff:/var/lib/docker/overlay2/9d7d10c85c5cdd6941910ec83daaa9ce407f5ec72f72c15b72beef8127c7355f/diff:/var/lib/docker/overlay2/0b4a214bd307b07e8a3daec5b386bde01a2b416d27bf73a845e6c3b06aba2039/diff:/var/lib/docker/overlay2/c85fc5ddc2b05c93c6b2682475a635ef62a7d615bafe9b740e81b969d6e6167d/diff",
"MergedDir": "/var/lib/docker/overlay2/8e886a7aad3604683346553ddf69aee84ef4a2b61ab437d23cb12be182c899d2/merged",
"UpperDir": "/var/lib/docker/overlay2/8e886a7aad3604683346553ddf69aee84ef4a2b61ab437d23cb12be182c899d2/diff",
"WorkDir": "/var/lib/docker/overlay2/8e886a7aad3604683346553ddf69aee84ef4a2b61ab437d23cb12be182c899d2/work"
}
},
"Mounts": [
{
"Type": "volume",
"Name": "e7e177fdf8e594340695b19199dd683a6127a5b61d19094a9d704767757b8547",
"Source": "/var/lib/docker/volumes/e7e177fdf8e594340695b19199dd683a6127a5b61d19094a9d704767757b8547/_data",
"Destination": "/data/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "c6b138a78aca",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": true,
"AttachStderr": true,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
],
"Cmd": [
"/bin/httpd",
"-f",
"-h",
"/data/web/html"
],
"Image": "tinyhttpd:v0.1-6",
"Volumes": {
"/data/mysql/": {}
},
"WorkingDir": "/usr/local",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "a96401150ae7ac1f26b58f191d61a35023935d7bf0dac5909fcce128f7a1566a",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/a96401150ae7",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "e6ef207afcee5bd46f0592bdf358b2bf96711d36be1dd253a76eab7fb1ae2202",
"Gateway": "10.0.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "10.0.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:0a:00:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "cfba3aa172b563b1554c48c3724cf2cf12cffb4f6df2d4196a3980e9d5a0c6f3",
"EndpointID": "e6ef207afcee5bd46f0592bdf358b2bf96711d36be1dd253a76eab7fb1ae2202",
"Gateway": "10.0.0.1",
"IPAddress": "10.0.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:0a:00:00:02"
}
}
}
}
]
那么由于上面我们动态暴露的是80端口,所以对于宿主机来访问该容器则是可以直接访问的
[root@localhost ~]# curl 10.0.0.2
this is index
但是实际上我们可以看到该容器是并没有暴露的,因为这是在镜像中暴露而不是在运行容器时候暴露的(还记得我们在运行容器时暴露是用P指定的),所以只要是镜像暴露的则我们运行容器时无需继续指定P暴露,可能这样说不太正确,反正这个东西也就是靠着意会。
[root@localhost ~]# docker port tinyweb1
那么我们尝试下P来暴露端口
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-6 /bin/httpd -f -h /data/web/html
然后再次在另外一个会话中查看暴露端口,可见端口已经自动暴露到宿主机的32768端口上了。
[root@localhost ~]# docker port tinyweb1
80/tcp -> 0.0.0.0:32768
那么,这样也是ok的
变量的使用
在本章开头我们已经了解了两种变量的使用,接下来我们也可以将变量应用在dockerinfo中了
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="nginx-1.15.2"
COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
VOLUME /data/mysql/
EXPOSE 80/tcp
然后我们再次制作镜像
[root@localhost img1]# docker build -t tinyhttpd:v0.1-7 ./
Sending build context to Docker daemon 1.053 MB
Step 1/9 : FROM busybox:latest
---> 018c9d7b792b
Step 2/9 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/9 : ENV DOC_ROOT /data/web/html/ WEB_SERVER_PACKAGE "nginx-1.15.2"
---> Running in d2ca1a413f79
---> 2dfd7c9a026b
Removing intermediate container d2ca1a413f79
Step 4/9 : COPY index.html ${DOC_ROOT:-/data/web/html/}
---> 8228930aff2f
Removing intermediate container afde3c46e385
Step 5/9 : COPY yum.repos.d /etc/yum.repos.d/
---> 6d58b9ba7439
Removing intermediate container c32f51c6e679
Step 6/9 : WORKDIR /usr/local/
---> 078b5a1f7354
Removing intermediate container 357e823b274b
Step 7/9 : ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
---> 4e75f75bc271
Removing intermediate container 45237c438589
Step 8/9 : VOLUME /data/mysql/
---> Running in 209483d7579d
---> 3233b947a678
Removing intermediate container 209483d7579d
Step 9/9 : EXPOSE 80/tcp
---> Running in 11644c5b9ab2
---> 0a05f47cec70
Removing intermediate container 11644c5b9ab2
Successfully built 0a05f47cec70
然后我们再来确认下我们用变量之后发现和没有用变量之前制作的镜像各方面都是正常五二的,这很不错。
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /usr/local
src
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /usr/local/src
nginx-1.15.2
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /usr/local/src/nginx-1.15.2
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 ls /data/web/html
index.html
接下来我们需要查看docker容器中都有些什么变量,用printenv可以查看到,该命令并非docker容器独有,在宿主机中依然可行。
[root@localhost img1]# docker run --name tinyweb1 --rm -P tinyhttpd:v0.1-7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=859d2fb4c7fc
DOC_ROOT=/data/web/html/
WEB_SERVER_PACKAGE=nginx-1.15.2
HOME=/root
那么接下来我们看看宿主机中运行printenv
[root@localhost img1]# printenv
XDG_SESSION_ID=2
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.108.1 60331 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root/img1
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=192.168.108.1 60331 192.168.108.128 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
_=/usr/bin/printenv
OLDPWD=/root
-e参数可以在docker容器运行时注入变量
[root@localhost img1]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="1.15.1" tinyhttpd:v0.1-7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=63138502154a
WEB_SERVER_PACKAGE=1.15.1
DOC_ROOT=/data/web/html/
HOME=/root
运行时注入对于镜像制作时所生成的文件是影响不到的,毕竟不在一个phase,一个是build时一个是run时
[root@localhost img1]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="1.15.1" tinyhttpd:v0.1-7 ls /usr/local/src
nginx-1.15.2
docker的CMD与RUN
docker在运行时我们可以指定如ls命令等而不是默认的bash即bin/bash,像是这样我们上面我个人称之为看完即删,而这里无论是bin/bash或ls等命令都算是CMD,是docker容器运行时的CMD命令,而docker运行时还有一种隐藏于背后的命令是RUN命令该命令可以利用注入在docker镜像制作时候的Dockerfile中。知道了这些后我们再反观上面我们有一个实例了解到ADD语法在Dockerfile中对于直接加载网络中的那个.tar.gz文件是不会自动解压释放的,而除非你是先下载到宿主机本地在进行ADD才可以。那么我们可以结合本次的RUN来实现即便是网络路径也可以在镜像制作后自动展开刚才的那个.tar.gz文件。
那么首先就是重新编写Dockerfile文件咯,其实也就是整理下变量以及增加下我们的这个.tar.gz网络文件的释放脚本而已。
[root@localhost img1]# vi Dockerfile
[root@localhost img1]# cat Dockerfile
#Description:test image
FROM busybox:latest
MAINTAINER "MageEdu <mage@magedu.com>"
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE="nginx-1.15.2.tar.gz"
COPY index.html ${DOC_ROOT:-/data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
WORKDIR /usr/local/
VOLUME /data/mysql/
EXPOSE 80/tcp
RUN cd /usr/local/src && \
tar xf ${WEB_SERVER_PACKAGE}
那么接下来我们直接制作版本9吧,哈哈8版本也直接跳过哈
[root@localhost img1]# docker build -t tinyhttpd:v0.1-9 ./
Sending build context to Docker daemon 1.053 MB
Step 1/10 : FROM busybox:latest
---> 018c9d7b792b
Step 2/10 : MAINTAINER "MageEdu <mage@magedu.com>"
---> Using cache
---> 1ed40385330f
Step 3/10 : ENV DOC_ROOT /data/web/html/ WEB_SERVER_PACKAGE "nginx-1.15.2.tar.gz"
---> Using cache
---> 9462612a67d8
Step 4/10 : COPY index.html ${DOC_ROOT:-/data/web/html/}
---> Using cache
---> ae5f19008f23
Step 5/10 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> cf69fe5a558c
Step 6/10 : ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src/
Downloading [==================================================>] 1.026 MB/1.026 MB
---> 4b42bebbbbe3
Removing intermediate container 4ed01a96631e
Step 7/10 : WORKDIR /usr/local/
---> 7b43b72c9b85
Removing intermediate container a0449f56a267
Step 8/10 : VOLUME /data/mysql/
---> Running in c36a71c452ab
---> f27c8292f4dc
Removing intermediate container c36a71c452ab
Step 9/10 : EXPOSE 80/tcp
---> Running in ee0a7dbf0297
---> aae2be8023a1
Removing intermediate container ee0a7dbf0297
Step 10/10 : RUN cd /usr/local/src && tar xf ${WEB_SERVER_PACKAGE}
---> Running in f77c3b192774
---> ea0a3ade1003
Removing intermediate container f77c3b192774
Successfully built ea0a3ade1003
然后我们再来看看我们的9版本中我们刚才的那个网络文件也的确得到释放了
[root@localhost img1]# docker run --name tinyweb1 --rm -P -e WEB_SERVER_PACKAGE="1.15.1" tinyhttpd:v0.1-9 ls /usr/loc al/src
nginx-1.15.2
nginx-1.15.2.tar.gz
关键字词:docker,Dockerfile,镜像制作
上一篇:06-Docker存储卷
下一篇:08-Dockerfile详解