可写的容器层
- 当容器启动时,一个新的可写层被加载到镜像的顶部;
- 新增加的这一层叫做“容器层”,“容器层”之下的叫做“镜像层”;
- 所有多容器的改动,无论是增加、删除、还是修改文件都只会发生在容器层;
- 容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改,这个操作叫做copy-on-write
构建镜像:
方法:
docker commit命令构建镜像
docker-file构建镜像
docker commit
- 运行容器:
docker run -it 镜像名称 - 安装需要的软件:
在运行的容器的内部 - 使用docker ps命令:
查看当前正在运行的容器,主要是查看容器名称 - 使用docker commit 运行容器名称 新的镜像名称
创建镜像
docker file
1.创建dockerfile文件:
vim Dockerfile
FROM ubuntu
RUN apt-get update && apt-get -y install vim
2.运行命令使用Dockerfile文件创建镜像:
[root@localhost ~]# docker build -t ubuntu-dockerfile .
Sending build context to Docker daemon 4.055 MB
Step 1/2 : FROM ubuntu
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
84ed7d2f608f: Pull complete
be2bf1c4a48d: Pull complete
a5bdc6303093: Pull complete
e9055237d68d: Pull complete
Digest: sha256:868fd30a0e47b8d8ac485df174795b5e2fe8a6c8f056cc707b232d65b8a1ab68
Status: Downloaded newer image for docker.io/ubuntu:latest
---> 1d9c17228a9e
Step 2/2 : RUN apt-get update && apt-get install -y vim
---> Running in c0eb0a550442
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [83.2 kB]
Processing triggers for libc-bin (2.27-3ubuntu1) ...
---> f24a4faf7b23
Removing intermediate container c0eb0a550442
Successfully built f24a4faf7b23
命令解释:
docker build :
-t :
ubuntu-dockerfile :
. :
3.查看创建成功的镜像文件
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-dockerfile latest f24a4faf7b23 8 minutes ago 170 MB
4.查看镜像的构建历史,也就是dockfile的执行过程
[root@localhost ~]# docker history ubuntu-dockerfile
IMAGE CREATED CREATED BY SIZE COMMENT
f24a4faf7b23 2 hours ago /bin/sh -c apt-get update && apt-get insta... 83.8 MB
1d9c17228a9e 4 days ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
4 days ago /bin/sh -c mkdir -p /run/systemd && echo '... 7 B
4 days ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0 B
4 days ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745 B
4 days ago /bin/sh -c #(nop) ADD file:c0f17c7189fc11b... 86.7 MB
镜像的缓存特性:
- Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建。
- 如果不想使用缓存,可以在docker build 命令中添加--no-cache命令选项
- 如果改变Dockfile中命令的执行顺序,但由于docker分层的结构特性,Docker 必须重建受影响的镜像层
1.修改原有的Dockerfile文件,添加复制一个文件到/
vim Dockerfile
FROM ubuntu
RUN apt-get update && apt-get install -y vim
COPY testfile /
2.创建需要被复制的文件
[root@localhost ~]# touch testfile
3.执行命令进行新镜像的构建
[root@localhost ~]# docker build -t ubuntu-dockerfile2 .
Sending build context to Docker daemon 4.059 MB
Step 1/3 : FROM ubuntu
---> 1d9c17228a9e
Step 2/3 : RUN apt-get update && apt-get install -y vim
---> Using cache #使用了缓存
---> f24a4faf7b23
Step 3/3 : COPY testfile /
---> ae5a3ec0f33a
Removing intermediate container 5461a0ed5c9a #移除创建镜像时启动的中间容器
Successfully built ae5a3ec0f33a #成功创建新的镜像
镜像的保存和分发:
docker hub是docker公司开发的和维护的公共仓库,用户可以注册账号后将自己构建的镜像通过docker push 用户名/仓库名:tag
命令将镜像上传到自己的仓库。
- 首相使用docker images m 命令查看本地已经构建的镜像:
root@jyq-virtual-machine:/home/jyq# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest d3a13ec4a0f1 2 weeks ago 132MB
root@jyq-virtual-machine:/home/jyq#
- 然后使用docker tag命令对存在的镜像进行重新的命名:
root@jyq-virtual-machine:/home/jyq# docker tag httpd:latest jiyongqiang0310/learn-test:v1
root@jyq-virtual-machine:/home/jyq# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jiyongqiang0310/learn-test v1 d3a13ec4a0f1 2 weeks ago 132MB
httpd latest d3a13ec4a0f1 2 weeks ago 132MB
- 登录已经申请的docker hub账号:
# 使用 -u 选项指定自己的用户名
root@jyq-virtual-machine:/home/jyq# docker login -u jiyongqiang0310
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
root@jyq-virtual-machine:/home/jyq#
- 登录成功后上传自己已经构建好的镜像文件:
root@jyq-virtual-machine:/home/jyq# docker push jiyongqiang0310/learn-test:v1
The push refers to repository [docker.io/jiyongqiang0310/learn-test]
32d58e8790a5: Layer already exists
15c7c3e3b182: Layer already exists
bc313b7c45f1: Layer already exists
7fb2893e5a45: Layer already exists
0a07e81f5da3: Layer already exists
v1: digest: sha256:214019bfc77677ac1f0c86b3a96e2b91600de7e2224f195b446cb13572cebb6b size: 1367
root@jyq-virtual-machine:/home/jyq#
- 登录 [https://hub.docker.com就可以看到自己上产的镜像文件
构建自己的仓库:
- 首先在自己本地的根目录创建一个用于存储镜像文件的目录:
root@jyq-virtual-machine:/# mkdir myregistry
- 然后使用docker开源的仓库软件启动一个容器:
# 启动一个仓库容器
root@jyq-virtual-machine:/# docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:2
Unable to find image 'registry:2' locally
2: Pulling from library/registry
169185f82c45: Pull complete
046e2d030894: Pull complete
188836fddeeb: Pull complete
832744537747: Pull complete
7ceea07e80be: Pull complete
Digest: sha256:870474507964d8e7d8c3b53bcfa738e3356d2747a42adad26d0d81ef4479eb1b
Status: Downloaded newer image for registry:2
83936c63e2488a40170f8c1afc42cce5f444f0b73f699ea4a5f4293a6633c1f8
#查看容器是否已经运行成功
root@jyq-virtual-machine:/# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
83936c63e248 registry:2 "/entrypoint.sh /etc…" 54 seconds ago Up 53 seconds 0.0.0.0:5000->5000/tcp xenodochial_noyce
35eaaec97f0b httpd "httpd-foreground" 24 hours ago Up 24 hours 0.0.0.0:8080->80/tcp goofy_swartz
- 将本地已经存在的镜像进行重命名,使其满足[registry-host]:[port]/[username]/xxx的格式:
root@jyq-virtual-machine:/# docker tag httpd:latest 192.168.100.128:5000/jiyongqiang/httpd:v1
root@jyq-virtual-machine:/# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.100.128:5000/jiyongqiang/httpd v1 d3a13ec4a0f1 2 weeks ago 132MB
- 然后使用docker push 命令将已经构建好的容器上传到自己的私有仓库。
命令回顾:
- docker run 运行容器
- docker commit 将运行的容器提交生成新的镜像
- docker build 使用DockerFile文件构建镜像
- docker history 查看某镜像构建时执行的命令
- docker images 查看本地已经存在的镜像文件
- docker ps -a 查看所有状态的容器
- docker container ls -a 同上
- docker tag 给本地镜像重新镜像tag命名
- docker pull 从仓库拉取镜像
- docker push 将镜像上传到仓库
- docker rmi 删除没有被启动容器使用的镜像文件