系列文章目录
docker常见用法之镜像构建1docker
- 系列文章目录
- 一、镜像的分层结构
- 二、容器的用法
- 三、镜像的构建
- 3.1docker commit 构建新镜像三部曲
- 3.1.1运行容器并且修改容器
- 3.1.2提交容器
- 3.1.2删除docker镜像
- 3.2Dockerfile构建镜像
- 系列文章目录
- 一、 Dockerfile写法详解
- 1.1 copy指令用法
- 1.2 ADD指令用法
- 1.3ENV指令用法
- 1.4EXPOSE指令用法
- 1.5VOLUME指令用法
- 1.6WORKDIR指令用法
- 1.7将数据存入宿主机原因
- 1.8RUN指令的用法
- 1.9CMD与ENTRYPOINT指令的用法
- 1.10Shell 和exec格式的区别
- 1.11ENTRYPOINT与CMD混合使用
- 系列文章目录
- 一、本文内容
- 二、基础的镜像的选取,通过docker查找拉取
- 三、nginx容器化
- 系列文章目录
- 一、镜像优化的意义及方法
- 二、使用多阶段构建
- 系列文章目录
- 配置docker镜像加速器
- 系列文章目录
- docker公有仓库
- docker私有仓库registry
- 系列文章目录
- 搭建私有仓库的意义
- 搭建私有仓库
- 搭建私有仓库的功能
- 实验环境的搭建:
- 无认证加密功能认证仓库的搭建
- 搭建认证加密功能的仓库(生成证书并启动registry)
- 搭建registry的认证功能
- 系列文章目录
- 一、harbor仓库(最小化安装)的搭建及用法
- 二、 harbor仓库添加功能模板(安全模块签名和扫描)
- 系列文章目录
- 一、本文内容
- 二、 docker原生网络
- 2.1容器间如何通信
- 2.1.1桥接模式
- 2.1.2host共享宿主机的网络
- 2.1.3none模式
- 三、docker自定义网络
- 四、Docker容器通信
- 五、 跨主机容器网络
- 系列文章目录
- docker卷
- bind mount
- docker managed volume
- bind mount 与 docker manager
- 卷插件
- convoy卷插件
一、镜像的分层结构
共享宿主机的内核(kernel)(容器的安全把宿主机安全管控好就好)
base镜像提供的是最小的linux发行版
同一docker主机支持运行多种linux发行版(因为linux内核一样,不一样的是文件系统)
采用分层结构的最大好处:共享资源(底层共享资源)
分层结构:降低了网络带宽和磁盘空间
(下载网上的镜像时候会判断你有该层没,你有相同层的话,你便不用下载了已经有的层。本机只要存储同样的镜像层一份,本机的镜像也可以共享)
Copy-on-Write(linux内核的写时复制技术)容器层可以写
容器层以下都不可以写(都是只读)
docker从上往下依次查找文件
容器层保存镜像变化的部分,并不会对镜像本身进行任何的修改
一个镜像最多127层(一般不会有那么大,因为优化就是减少镜像层)
二、容器的用法
容器常用用法:
-i交互式 | -t打开一个tty终端 |
---|---|
-d打入后台 | -name给容器起个名字 |
ctrl +d 退出容器终端并且容器停掉 | docker ps显示正在运行的容器 |
ctrl +pq 退出容器终端并且容器后台运行 | docker ps +a 显示所有的容器 |
docker rm +容器名字 删掉已经停止的容器 | 容器正在running状态需要先stop,在rm |
强制删除,不用停止容器直接删除rm-f + 容器名字 | docker -p 宿主机端口:容器内的端口,用宿主机的端口号映射容器内的端口 |
docker start + 容器名字,开启容器 | docker container attach +容器名字,进入该容器 |
docker images 查看容器已经有的镜像 | docker history +容器名字,查看之前打包的历史记录 |
docker rmi +镜像名字,删除镜像 | docker load 导入镜像 |
docker port + 容器名字,可以查看容器的端口映射 | –restart=always随着docker引擎的开启该容器自动启动 |
docker inspect + 容器名字或者id,查看容器具体信息 | docker inspect +镜像,查看镜像的具体信息 |
docker -v 宿主机路径:容器路径,数据持久化 | docker exec -it 容器名字 sh 重新进入交互式容器中不能tab补齐 |
– | docker -v 将宿主机资源挂载到容器内 |
docker exec -it 容器名字 bash 重新进入交互式容器中能tab补齐 |
[root@docker1 docker]# docker container
attach diff kill port rm stop wait
commit exec logs prune run top
cp export ls rename start unpause
create inspect pause restart stats update
三、镜像的构建
镜像的名称是不能冲突的
3.1docker commit 构建新镜像三部曲
不推荐该方法
运行容器 | docker run |
---|---|
修改容器 | |
将容器保存为新的镜像 | |
缺点:效率低、可重复性弱、容易出错 |
使用者无法对镜像进行审计,存在安全隐患
3.1.1运行容器并且修改容器
[root@docker1 docker]# docker run -it --name test busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # touch file1
/ # touch file2
/ # touch file3
/ # ls
bin etc file2 home root tmp var
dev file1 file3 proc sys usr
ctrl +d
[root@docker1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker1 docker]# docker start test
test
[root@docker1 docker]# docker container attach test
/ #
ctrl +pq
[root@docker1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7d589bd8615e busybox "sh" 27 minutes ago Up 5 minutes test
3.1.2提交容器
[root@docker1 docker]# docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
[root@docker1 docker]# docker commit -m "v1" test test:v1
sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
[root@docker1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 dc00eef3c58e 55 seconds ago 1.24MB
busybox latest beae173ccac6 3 weeks ago 1.24MB
missing 表示在别人机器上打包的你看不到,v1创建了3个文件
只能看到sh,不知道用户在其中具体干了什么,不便于用户审计和重用,安全隐患。
[root@docker1 docker]# docker history test:v1
IMAGE CREATED CREATED BY SIZE COMMENT
dc00eef3c58e 2 minutes ago sh 166B v1
beae173ccac6 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4… 1.24MB
[root@docker1 docker]# docker history busybox:latest
IMAGE CREATED CREATED BY SIZE COMMENT
beae173ccac6 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4… 1.24MB
分层结构的好处,共享资源。两个镜像都用了最后2层,但操作系统上面只用保存一份。彼此共享,镜像层是只读的
[root@docker1 docker]# docker run -it --name demo test:v1
/ # ls
bin dev etc file1 file2 file3 home proc root sys tmp usr var
3.1.2删除docker镜像
删除原先docker三部曲创建的镜像
当前有容器占用镜像,所以删不了该镜像。删除镜像的时候,先保证没有容器占用该镜像
[root@docker1 docker]# docker rmi test:v1
Error response from daemon: conflict: unable to remove repository reference "test:v1" (must force) - container 1e534ccc1bb7 is using its referenced image dc00eef3c58e
docker ps-a 找到占用镜像的容器删掉,然后删除容器镜像
[root@docker1 docker]# docker rm -f demo
demo
[root@docker1 docker]# docker rmi test:v1
Untagged: test:v1
Deleted: sha256:dc00eef3c58e0c21318a3a8bc9f4586f75e18b460211cb4bed1f565134924cf4
Deleted: sha256:9e982fbda3a1bbb95e62de21d15b305daef87bab314f218a62afbfd3f9939c2e
3.2Dockerfile构建镜像
创建一个Dockerfile (必须在一个空目录中创建) 因为一开始会发送内容给Docker引擎,如果在很大/目录上面构建,会把整个/发送去构建
构建镜像
[root@docker1 docker]# cd
[root@docker1 ~]# ls
[root@docker1 ~]# mkdir docker
[root@docker1 ~]# cd docker/
[root@docker1 docker]# ls
[root@docker1 docker]# vim Dockerfile
FROM 从那个基础镜像开始构建,给予它一个环境(构建方式,通过基础镜像,运行一个容器,(后台)在里面执行指令)
RUN在容器里面运行什么指令
.是从当前目录读取
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
里面有构建镜像的具体参数
[root@docker1 docker]# docker build --help
每一个RUN,一层。相当于,你每一次运行,执行了一次Docker commit
[root@docker1 docker]# docker build -t test:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM busybox
---> beae173ccac6
Step 2/4 : RUN touch file1
---> Running in 0121d9c6c701
Removing intermediate container 0121d9c6c701
---> 884a1d2fcbd4
Step 3/4 : RUN mkdir dir1
---> Running in f45072d8860b
Removing intermediate container f45072d8860b
---> 3f7259a48bfc
Step 4/4 : RUN mv file1 dir1
---> Running in 612208e6db5b
Removing intermediate container 612208e6db5b
---> b6b7f570cc47
Successfully built b6b7f570cc47
Successfully tagged test:v1
便于审计并且便于重用,因为这个文件Dockerfile已经写下来了
在Dockerfile中写的每一行通过Docker commit提交成镜像层
END
系列文章目录
docker常用方法之dockerfile入门指令用法2docker
- 系列文章目录
- 一、镜像的分层结构
- 二、容器的用法
- 三、镜像的构建
- 3.1docker commit 构建新镜像三部曲
- 3.1.1运行容器并且修改容器
- 3.1.2提交容器
- 3.1.2删除docker镜像
- 3.2Dockerfile构建镜像
- 系列文章目录
- 一、 Dockerfile写法详解
- 1.1 copy指令用法
- 1.2 ADD指令用法
- 1.3ENV指令用法
- 1.4EXPOSE指令用法
- 1.5VOLUME指令用法
- 1.6WORKDIR指令用法
- 1.7将数据存入宿主机原因
- 1.8RUN指令的用法
- 1.9CMD与ENTRYPOINT指令的用法
- 1.10Shell 和exec格式的区别
- 1.11ENTRYPOINT与CMD混合使用
- 系列文章目录
- 一、本文内容
- 二、基础的镜像的选取,通过docker查找拉取
- 三、nginx容器化
- 系列文章目录
- 一、镜像优化的意义及方法
- 二、使用多阶段构建
- 系列文章目录
- 配置docker镜像加速器
- 系列文章目录
- docker公有仓库
- docker私有仓库registry
- 系列文章目录
- 搭建私有仓库的意义
- 搭建私有仓库
- 搭建私有仓库的功能
- 实验环境的搭建:
- 无认证加密功能认证仓库的搭建
- 搭建认证加密功能的仓库(生成证书并启动registry)
- 搭建registry的认证功能
- 系列文章目录
- 一、harbor仓库(最小化安装)的搭建及用法
- 二、 harbor仓库添加功能模板(安全模块签名和扫描)
- 系列文章目录
- 一、本文内容
- 二、 docker原生网络
- 2.1容器间如何通信
- 2.1.1桥接模式
- 2.1.2host共享宿主机的网络
- 2.1.3none模式
- 三、docker自定义网络
- 四、Docker容器通信
- 五、 跨主机容器网络
- 系列文章目录
- docker卷
- bind mount
- docker managed volume
- bind mount 与 docker manager
- 卷插件
- convoy卷插件
一、 Dockerfile写法详解
看docker官方的网站学习docker具体指令
常用指令:
FROM 指定base镜像,如果本地不存在会从远程仓库下载 | MAINTAINER 设置镜像的作者,比如用户邮箱等 |
---|---|
COPY 把文件从build context 复制到镜像 支持两种形式:COPY src dest 和 COPY 【“src,”“dest”】 src必须指定build context 中的文件或目录 |
1.1 copy指令用法
src必须指定build context 中的文件或目录即当前目录
实验环境:
[root@docker1 docker]# vim index.html
[root@docker1 docker]# cat index.html
www.yan.com
编写Dockerfile:
[root@docker1 docker]# vim Dockerfile
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
前面镜像用的cache,因为之前编译过,Dockerfile没有改变都是用缓存来执行,加速构建过程
[root@docker1 docker]# docker build -t test:v2 .
Sending build context to Docker daemon 3.072kB
Step 1/5 : FROM busybox
---> beae173ccac6
Step 2/5 : RUN touch file1
---> Using cache
---> 884a1d2fcbd4
Step 3/5 : RUN mkdir dir1
---> Using cache
---> 3f7259a48bfc
Step 4/5 : RUN mv file1 dir1
---> Using cache
---> b6b7f570cc47
Step 5/5 : COPY index.html /
---> 317f587b99ce
Successfully built 317f587b99ce
Successfully tagged test:v2
拷贝文件到容器中
[root@docker1 docker]# docker history test:v2
IMAGE CREATED CREATED BY SIZE COMMENT
317f587b99ce 2 minutes ago /bin/sh -c #(nop) COPY file:d88a99d823b18eab… 12B
b6b7f570cc47 34 minutes ago /bin/sh -c mv file1 dir1 0B
3f7259a48bfc 34 minutes ago /bin/sh -c mkdir dir1 0B
884a1d2fcbd4 34 minutes ago /bin/sh -c touch file1 0B
beae173ccac6 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 3 weeks ago /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4… 1.24MB
执行的指令,ls /接在镜像的后面会覆盖掉镜像原有的操作指令。
–rm帮助运行完容器指令后自动删除该容器
[root@docker1 docker]# docker run --rm test:v2 ls /
bin
dev
dir1
etc
home
index.html
proc
root
sys
tmp
usr
var
[root@docker1 docker]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker1 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1.2 ADD指令用法
ADD用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像:
实验环境:
[kiosk@foundation38 lamp]$ scp nginx-1.18.0.tar.gz root@172.25.254.1:/root/docker
[root@docker1 docker]# ls
Dockerfile index.html nginx-1.18.0.tar.gz
编写Dockefile:
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
[root@docker1 docker]# docker build -t test:v3 .
Sending build context to Docker daemon 1.043MB
Step 1/6 : FROM busybox
---> beae173ccac6
Step 2/6 : RUN touch file1
---> Using cache
---> 884a1d2fcbd4
Step 3/6 : RUN mkdir dir1
---> Using cache
---> 3f7259a48bfc
Step 4/6 : RUN mv file1 dir1
---> Using cache
---> b6b7f570cc47
Step 5/6 : COPY index.html /
---> Using cache
---> 317f587b99ce
Step 6/6 : ADD nginx-1.18.0.tar.gz /
---> 88b81d3d9f28
Successfully built 88b81d3d9f28
Successfully tagged test:v3
解压后放入,基础镜像没有解压命令,所以在构建前用ADD构建。
[root@docker1 docker]# docker run --rm test:v3 ls /
bin
dev
dir1
etc
home
index.html
nginx-1.18.0
proc
root
sys
tmp
usr
var
1.3ENV指令用法
设置环境变量,变量可以被后续的指令使用:
变量名大写
Dockerfile写法:
[root@docker1 docker]# cat Dockerfile
ENV HOSTNAME docker1
1.4EXPOSE指令用法
用于应用容器,要发布一个服务的容器。
如果容器中运行应用服务,可以把服务端口暴露出去:
EXPOSE 80
[root@docker1 docker]# cat Dockerfile
EXPOSE 80
1.5VOLUME指令用法
应用容器的数据需要持久化
申明数据卷,通常指定的是应用的数据挂载点:
[root@docker1 docker]# cat Dockerfile
VOLUME ["/data"]
1.6WORKDIR指令用法
为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。即,容器内切换目录。
前面3个用法的运行结果:
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
运行结果就不写在代码块了
[root@docker1 docker]# docker build -t test:v4 .
data是前面定义的数据卷
[root@docker1 docker]# docker run -it test:v4
/dir1 # cd /data/
/data #
这个卷挂载你宿主机的上面
/data # mount |grep data
/dev/mapper/rhel-root on /data type xfs (rw,relatime,attr2,inode64,noquota)
docker里面看到的是宿主机的信息,磁盘、cpu、内存这些信息存在/proc,/proc是文件系统里面的不会被隔离。
/data # df
Filesystem 1K-blocks Used Available Use% Mounted on
overlay 17811456 1594500 16216956 9% /
tmpfs 65536 0 65536 0% /dev
tmpfs 1023468 0 1023468 0% /sys/fs/cgroup
shm 65536 0 65536 0% /dev/shm
/dev/mapper/rhel-root
17811456 1594500 16216956 9% /data
/dev/mapper/rhel-root
17811456 1594500 16216956 9% /etc/resolv.conf
/dev/mapper/rhel-root
17811456 1594500 16216956 9% /etc/hostname
/dev/mapper/rhel-root
17811456 1594500 16216956 9% /etc/hosts
tmpfs 1023468 0 1023468 0% /proc/asound
tmpfs 1023468 0 1023468 0% /proc/acpi
tmpfs 65536 0 65536 0% /proc/kcore
tmpfs 65536 0 65536 0% /proc/keys
tmpfs 65536 0 65536 0% /proc/timer_list
tmpfs 65536 0 65536 0% /proc/timer_stats
tmpfs 65536 0 65536 0% /proc/sched_debug
tmpfs 1023468 0 1023468 0% /proc/scsi
tmpfs 1023468 0 1023468 0% /sys/firmware
docker运行的主机:
[root@docker1 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/rhel-root 17811456 1594500 16216956 9% /
devtmpfs 1011400 0 1011400 0% /dev
tmpfs 1023468 0 1023468 0% /dev/shm
tmpfs 1023468 17076 1006392 2% /run
tmpfs 1023468 0 1023468 0% /sys/fs/cgroup
/dev/vda1 1038336 135172 903164 14% /boot
tmpfs 204696 0 204696 0% /run/user/0
overlay 17811456 1594500 16216956 9% /var/lib/docker/overlay2/0d9fe361ffa5bec1667b38b2dc660e093a1dd319d69a23a6e498683163971fc5/merged
这个便是容器挂载在宿主机上面的卷
/dev/mapper/rhel-root 17811456 1594500 16216956 9% /
查看一下该容器的具体信息
docker inspect 后面可以加容器也可以镜像
[root@docker1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4c626bd8688f test:v4 "sh" 14 seconds ago Up 13 seconds 80/tcp romantic_bhabha
999fd34ca89f test:v4 "sh" 4 hours ago Exited (255) About a minute ago 80/tcp peaceful_wing
[root@docker1 ~]# docker inspect 4c626bd8688f
inspect查询部分信息:
Gateway是宿主机上面的地址,docker 0的地址。所以容器会通过桥接的模式到达宿主机的网关
所有容器的数据会放在宿主机的/var/lib/docker,如果把这个删掉,所有的镜像容器全没了。
[root@docker1 docker]# ls
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
容器的卷的目录在/var/lib/docker/volumes
"Gateway": "172.17.0.1"
"IPAddress": "172.17.0.2",
"Mounts": [
{
"Type": "volume",
"Name": "a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171",
"Source": "/var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
]
这个路径就被挂载在容器的目录里面
"Source": "/var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data",
容器里面:
/data # touch file1
/data # ls
file1
宿主机上:
[root@docker1 ~]# cd /var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data
[root@docker1 _data]# ls
file1
宿主机docker0的地址:
[root@docker1 ~]# ip addr | grep 172.17.0.1
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
容器里面查询ip的结果:
/dir1 # ip addr
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
1.7将数据存入宿主机原因
1.容器的文件系统性能比宿主机差
2.数据过大放在容器不合适,不小心删掉容器,数据就丢失了
同理存在宿主机上面:
宿主机删掉该数据,容器里面的数据就没有了
宿主机:
[root@docker1 ~]# cd /var/lib/docker/volumes/a780ebed1de6be544711f18a254682fc4f018ce2f7058b0a23f6f16a3eb73171/_data
[root@docker1 _data]# ls
file1
[root@docker1 _data]# rm -fr file1
容器里面:
/data # ls
file1
/data # ls
/data #
1.8RUN指令的用法
在容器中运行命令并创建新的镜像层,常用于安装软件包:
RUN yum install -y vim
1.9CMD与ENTRYPOINT指令的用法
这两个指令都是用于设置容器后执行的命令,但CMD会被docker run 后面的命令行覆盖(比如docker run -it /ls会覆盖掉),而ENTRYPOINT不会被忽略,一定会被执行
docker run 后面的参数可以传递给ENTRYPOINT指令当作参数
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效
CMD当用户进入后自动执行的指令,像busybox这个镜像第二层,意思就是当用户进去后,自动执行sh
官方推荐CMD用exec格式写
[root@docker1 docker]# docker history test:v1
beae173ccac6 3 weeks ago /bin/sh -c #(nop) CMD ["sh"] 0B
1.10Shell 和exec格式的区别
Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而exec格式不会
而用exec格式写的话:[“/bin/sh”,“-c”,“echo $变量名”]
Shell格式:
[root@docker1 docker]# vim Dockerfile
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD echo $HOSTNAME
[root@docker1 docker]# docker build -t test:v5 .
[root@docker1 docker]# docker run --rm test:v5
docker1
exec格式:
[root@docker1 docker]# vim Dockerfile
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v6 .
[root@docker1 docker]# docker run --rm test:v6
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "echo $HOSTNAME": executable file not found in $PATH: unknown.
[root@docker1 docker]# docker rmi test:v6
[root@docker1 docker]# vim Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["/bin/echo","echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v6 .
[root@docker1 docker]# docker run --rm test:v6
echo $HOSTNAME
用exec格式写:
[root@docker1 docker]# vim Dockerfile
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
CMD ["/bin/echo","-c","echo $HOSTNAME"]
[root@docker1 docker]# docker build -t test:v7 .
[root@docker1 docker]# docker run --rm test:v7
docker1
Exec格式时,ENTRYPOINT可以通过CMD提供额外的参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。即ENTRYPOINT与CMD混合使用
1.11ENTRYPOINT与CMD混合使用
[root@docker1 docker]# vim Dockerfile
[root@docker1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
RUN mkdir dir1
RUN mv file1 dir1
COPY index.html /
ADD nginx-1.18.0.tar.gz /
ENV HOSTNAME docker1
EXPOSE 80
VOLUME ["/data"]
WORKDIR /dir1
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
[root@docker1 docker]# docker build -t test:v8 .
[root@docker1 docker]# docker run --rm test:v8
hello world
[root@docker1 docker]# docker run --rm test:v8 linux
hello linux
[root@docker1 docker]# docker run --rm test:v8 yan
hello yan
END
系列文章目录
docker之封装镜像之nginx容器化3docker
- 系列文章目录
- 一、镜像的分层结构
- 二、容器的用法
- 三、镜像的构建
- 3.1docker commit 构建新镜像三部曲
- 3.1.1运行容器并且修改容器
- 3.1.2提交容器
- 3.1.2删除docker镜像
- 3.2Dockerfile构建镜像
- 系列文章目录
- 一、 Dockerfile写法详解
- 1.1 copy指令用法
- 1.2 ADD指令用法
- 1.3ENV指令用法
- 1.4EXPOSE指令用法
- 1.5VOLUME指令用法
- 1.6WORKDIR指令用法
- 1.7将数据存入宿主机原因
- 1.8RUN指令的用法
- 1.9CMD与ENTRYPOINT指令的用法
- 1.10Shell 和exec格式的区别
- 1.11ENTRYPOINT与CMD混合使用
- 系列文章目录
- 一、本文内容
- 二、基础的镜像的选取,通过docker查找拉取
- 三、nginx容器化
- 系列文章目录
- 一、镜像优化的意义及方法
- 二、使用多阶段构建
- 系列文章目录
- 配置docker镜像加速器
- 系列文章目录
- docker公有仓库
- docker私有仓库registry
- 系列文章目录
- 搭建私有仓库的意义
- 搭建私有仓库
- 搭建私有仓库的功能
- 实验环境的搭建:
- 无认证加密功能认证仓库的搭建
- 搭建认证加密功能的仓库(生成证书并启动registry)
- 搭建registry的认证功能
- 系列文章目录
- 一、harbor仓库(最小化安装)的搭建及用法
- 二、 harbor仓库添加功能模板(安全模块签名和扫描)
- 系列文章目录
- 一、本文内容
- 二、 docker原生网络
- 2.1容器间如何通信
- 2.1.1桥接模式
- 2.1.2host共享宿主机的网络
- 2.1.3none模式
- 三、docker自定义网络
- 四、Docker容器通信
- 五、 跨主机容器网络
- 系列文章目录
- docker卷
- bind mount
- docker managed volume
- bind mount 与 docker manager
- 卷插件
- convoy卷插件
一、本文内容
学会如何自己封装一个完整的镜像,将nginx容器化并且优化该镜像
容器启动后,宿主机能上网,容器也能上网。
二、基础的镜像的选取,通过docker查找拉取
[root@docker1 yum.repos.d]# docker search rhel7
STARS是下载量