Docker每日一阅(6):Docker 练习:Dockerfile环境变量,打包镜像
文章目录
0 回顾
- 查看运行容器的日志(
docker container logs [container id]
) - 关闭正在运行的容器(
docker container stop [container id]
) - 创建镜像(
docker container commit [container id]
/docker image build ...
) - 查看镜像的详细信息(
docker image inspect [image id]
) - 对docker image run相关,包括
docker container run --name [container_name] [docker_image]
docker container run -d [docker_image]
docker container run -it [docker_image]
docker container run -p [host_ip]:[host_port]:[container_port] [docker_image]
docker container run -v [/host/volume/location]:[/container/storage] [docker_image]
docker container run --mount type=bind,source=[/host/volume/location],destination=[/container/storage] [docker_image]
docker container run --rm [docker_image]
0 任务描述
- 练习1:Dockerfile的环境变量
- 练习2:查错
- 练习3:打包镜像
- 练习4:容器命名
- 练习5:文件传输
1 练习:Dockerfile的环境变量
1.1 问题
如下为一个Dockerfile里的内容:
FROM busybox
CMD echo $myhost
我们需要自己新建一个Dockerfile,然后build这个镜像:
docker build -t testimage .
新建一个容器,并且设置一个环境变量myhost
:
docker run --rm -e myhost=host1 testimage
当你修改Dockerfile后,你的道德输出应该是:host1
。
如果你没有设置此环境变量,运行docker run --rm testimage
,你所得到的输出是:testhost
。(注意,修改完dockerfile之后,需要重新新建镜像和运行容器)
1.2 答案
修改Dockerfile为:
FROM busybox
ENV myhost=testhost
CMD echo $myhost
2 练习:查错
2.1 问题
现在,让我们将Dockerfile修改为:
FROM alpine
ENV ITEM value
ENTRYPOINT echo ${ITEM;}
让我们来新建镜像:docker build -t testenv1 .
,并且运行容器:docker run --rm -e ITEM=5 testenv1
。我们会发现出错了。找到错误的根源并修改。
2.2 答案
Dockerfile可以修改为:
FROM alpine
ENV ITEM value
ENTRYPOINT echo ${ITEM}
ITEM
后面有一个;
需要删除。
3 练习:打包镜像
3.1 问题
现在,让我们把Dockerfile修改为
FROM scratch
COPY a.txt /
并且,在此当前目录下新添加一个a.txt
文件,里面随便写点什么,比如我写了个“1”。
问题:
- 如果查看我们新建的镜像大小?
- 如何打包这个镜像到tar文件?
- 如何查看这个镜像里有什么?
3.2 答案
让我们先新建一个镜像:
docker build -t imageex3 .
我们可以通过inspect
命令来查看镜像的详细信息:
docker image inspect -f '{{ .Size }}' imageex3
terminal中返回:1239748
。
我们可以通过docker image save
来保存镜像到tar文件:
docker save -o imageex3.tar imageex3
在terminal当前路径下,我们就能看到一个imageex3.tar
压缩包。
我们可以解压,然后看看里面有什么:
mkdir tmp
cd tmp
tar xvf ../imageex3.tar
4 练习:容器命名
4.1 问题
如果我们运行如下指令:
docker run -it --name=test1 alpine:latest date
docker run -it --name=test1 alpine:latest date
我们会发现,运行第二段的时候会报错。那么为什么不成功呢?
4.2 答案
问题在于,我们不能给两个容器同一名称。我们可以做出如下修改
docker run -it --rm --name=test1 alpine:latest date
docker run -it --name=test1 alpine:latest date
即,当我们运行完第一个容器后,就把它删除,然后再运行第二个容器。或者
docker run -it --name=test1 alpine:latest date
docker run -it --name=test2 alpine:latest date
给不同的容器不同的命名。
5 练习:文件传输
5.1 问题
如果一个容器已经开始运行,那么我们如何将主机的某个文件传到这个容器的某个路径下?
5.2 答案
一种解决方式是使用docker cp
将文件复制到容器中。
首先,我们在一个terminal中运行一个容器
docker run -it --rm --name=dockerex5 alpine:latest sh
然后,在另外一个terminal中,
docker container cp $pwd/a.txt dockerex5:/tmp