docker 学习基本操作一

可写的容器层

  • 当容器启动时,一个新的可写层被加载到镜像的顶部;
  • 新增加的这一层叫做“容器层”,“容器层”之下的叫做“镜像层”;
  • 所有多容器的改动,无论是增加、删除、还是修改文件都只会发生在容器层;
  • 容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改,这个操作叫做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就可以看到自己上产的镜像文件
    docker 学习基本操作一_第1张图片
    企业微信截图_15517653131553.png

构建自己的仓库:

  • 首先在自己本地的根目录创建一个用于存储镜像文件的目录: 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 删除没有被启动容器使用的镜像文件

你可能感兴趣的:(docker 学习基本操作一)