linux 学习笔记-101-docker-通过模板创建镜像,容器管理,仓库管理,数据管理

发布于 2018-06-04  171 次阅读


通过模板创建镜像

下载模板

[root@am-01:~#] wget http://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz

--2018-06-01 00:53:40--  http://download.openvz.org/template/precreated/centos-6-x86_64-minimal.tar.gz

Resolving download.openvz.org (download.openvz.org)... 185.231.241.69

Connecting to download.openvz.org (download.openvz.org)|185.231.241.69|:80... connected.

HTTP request sent, awaiting response... 200 OK

Length: 215553751 (206M) [application/x-gzip]

Saving to: ‘centos-6-x86_64-minimal.tar.gz’



100%[========================================================================================>] 215,553,751 1.16MB/s   in 4m 12s



2018-06-01 00:57:59 (835 KB/s) - ‘centos-6-x86_64-minimal.tar.gz’ saved [215553751/215553751]

#下载 centos6 模板

导入模板为镜像

[root@am-01:~#] cat centos-6-x86_64-minimal.tar.gz | docker import - centos6

sha256:d150b06d291ae6e4812b742c0411d02ef6cd25f10ac7b373839ec31c424fb8b4

[root@am-01:~#] docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

centos6             latest              d150b06d291a        22 seconds ago      553MB

#导入模板为镜像,查询一下可以见到多了个 centos6 的镜像

启动镜像并进入容器

[root@am-01:~#] docker run -itd centos6 bash

41ea5f8ca52ba9a3e8b8a3541753f05f12a4eabca5b2f190f60eef16aa26c0de

[root@am-01:~#] docker exec -it 41ea5f8ca52b bash

[root@41ea5f8ca52b /]# cat /etc/issue

CentOS release 6.8 (Final)

Kernel \r on an \m

#启动镜像并进入容器,查询内核版本可以见到的确是 centos6 的版本

导出镜像

[root@am-01:~#] docker save -o am-centos6.tar centos6

[root@am-01:~#] ls

am-centos6.tar

停止在运行的容器和删除镜像

[root@am-01:~#] docker stop 41ea5f8ca52b

41ea5f8ca52b

#这里是停止容器

[root@am-01:~#] docker rmi d150b06d291a

Untagged: centos6:latest

Deleted: sha256:d150b06d291ae6e4812b742c0411d02ef6cd25f10ac7b373839ec31c424fb8b4

Deleted: sha256:dbcc6b3893af5f0b45e06f2934f73f5dc34f2e9e54fc4d50a51cc47195f19089

#这个是删除镜像

[root@am-01:~#] docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

am-centos           latest              daa937030543        2 hours ago         269MB

ubuntu              latest              452a96d81c30        4 weeks ago         79.6MB

centos              latest              e934aafc2206        7 weeks ago         199MB

导入镜像

[root@am-01:~#] docker load --input am-centos6.tar

dbcc6b3893af: Loading layer [==================================================>]  565.2MB/565.2MB

Loaded image: centos6:latest

[root@am-01:~#] docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

centos6             latest              d150b06d291a        22 minutes ago      553MB

#导出镜像(save)和导入镜像(load)是一对的,而导出镜像(export)和导入镜像(import)是一对的,不能搞混

#导入镜像(load)还有另一种方式"docker load < aming-centos.tar"

#"docker push image_name"可以把自己的镜像传到 dockerhub 官方网站上去,但前提是需要先注册一个用户

#导出镜像(export)和导入镜像(import)相关知识:https://www.cnblogs.com/Cherry-Linux/p/8025777.html

容器管理

创建一个未启动的容器

[root@am-01:~#] docker create -it centos6 bash

6784dc08eefc1923323169fa9fc2caea80190335eb41629a37b861b0901cc35b

[root@am-01:~#] docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

6784dc08eefc        centos6             "bash"              6 seconds ago       Created                                 vigilant_leakey

#创建一个容器,是未启动的容器,需要使用-a 参数才可以查看,创建容器用的是镜像名称

启动容器

[root@am-01:~#] docker start 042a716c650c

042a716c650c

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

042a716c650c        centos6             "bash"              31 seconds ago      Up 3 seconds                            serene_kilby

#启动容器用的是容器的 CONTAINER ID

#还有有 stop,和 restart 两个动作可以使用

#之前我们使用的 docker run 相当于先 create 再 start

创建容器并进入

[root@am-01:~#] docker run -it centos6 bash

[root@ed5da9382327 /]# ls

bin  boot  dev  etc  fastboot  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var

[root@ed5da9382327 /]# exit

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

042a716c650c        centos6             "bash"              8 minutes ago       Up 8 minutes                            serene_kilby

8f23e1d37005        am-centos           "/bin/bash"         19 hours ago        Up 19 hours                             objective_heisenberg

7806f848bf85        centos              "/bin/bash"         19 hours ago        Up 19 hours                             laughing_curran

[root@am-01:~#] docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

ed5da9382327        centos6             "bash"              4 minutes ago       Exited (0) 20 seconds ago                       goofy_mirzakhani

#如果加上-d 参数则会使容器在后台运行,不加上-d 参数则直接进入容器

#如果容器在后台运行,想进入就得使用"docker exec -it 'CONTAINER ID' bash"的方式

#使用命令 exit 或者 ctrl d 退出该 bash,当退出后这个容器也会停止,这是因为这个容器并没有在后台运行

#创建和启动容器建议使用"docker run -itd"的方式

创建并启动容器的时候给这个容器命名

[root@am-01:~#] docker run -itd --name Test d150b06d291a bash

95605871f056f59a3d0c7a9273c14b8994efa13ea72e5f8ef7cba9fca8df0451

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

95605871f056        d150b06d291a        "bash"              37 seconds ago      Up 32 seconds                           Test

#使用--name 参数可以给容器自定义名字,之后跟着镜像名或者 IMAGE ID 和 shell

使用自定义名字进入容器

[root@am-01:~#] docker exec -it Test bash

[root@95605871f056 /]# ls

bin  boot  dev  etc  fastboot  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var

#这时就可以直接使用自定义的名字去进入容器了

退出容器时直接把容器删除

docker run --rm -it centos6 bash -c "sleep 30"

#这句命令的作用是创建并运行指定容器,之后执行一句命令,再在指定时间后把容器删除,关键字是-rm 参数

获取容器的运行历史信息

[root@am-01:~#] docker run -itd centos6 bash -c "echo 123"

bf6c46984cd5fe0ab66efd26541e85626eaf8418bb4c99d796f6286b1be8e91e

[root@am-01:~#] docker logs bf6c46984c

123

#用法为 docker logs  container_id

进入一个在后台运行的容器

docker attach  container_id 可以进入一个在后台运行的容器,但是 attach 命令不算好用,比如我们想要退出终端,就得 exit 了,这样容器也就退出了

所以建议进入一个在后台运行的容器使用 docker exec -it container_id  bash,临时打开一个虚拟终端,这样就算退出容器,容器也依然在后台运行

删除容器

[root@am-01:~#] docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                     PORTS               NAMES

bf6c46984cd5        centos6             "bash -c 'echo 123'"   3 minutes ago       Exited (0) 3 minutes ago                       lucid_blackwell

7a82c30367ef        centos6             "bash"                 6 minutes ago       Up 6 minutes                                   Test

[root@am-01:~#] docker rm bf6c46984cd5

bf6c46984cd5

[root@am-01:~#] docker rm 7a82c30367ef

Error response from daemon: You cannot remove a running container 7a82c30367ef20b44c4eb3045843f174c55c0a06bffce41a314a8806b35cdec2. Stop the container before attempting removal or force remove

[root@am-01:~#] docker rm -f 7a82c30367ef

7a82c30367ef

[root@am-01:~#] docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#删除一个没运行的容器可以直接使用 rm 参数,删除一个正在运行的容器,需要再加上-f 参数

仓库管理

在使用 pull 拉取镜像的时候,是从官方的仓库拉取镜像的,推送镜像,也是推送到官方的仓库,我们可以在本地搭建私有仓库

下载搭建私有仓库的镜像

[root@am-01:~#] docker pull registry

Using default tag: latest

latest: Pulling from library/registry

81033e7c1d6a: Pull complete

b235084c2315: Pull complete

c692f3a6894b: Pull complete

ba2177f3a70e: Pull complete

a8d793620947: Pull complete

Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54

Status: Downloaded newer image for registry:latest

[root@am-01:~#] docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

registry            latest              d1fd7d86a825        4 months ago        33.3MB

使用私有仓库镜像

[root@am-01:~#] docker run  -d -p 5000:5000 registry

9b6f810388a0e151875404812f74c58610a70ff3825edb4cbd9053876454490b

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

9b6f810388a0        registry            "/entrypoint.sh /etc…"   14 seconds ago      Up 5 seconds        0.0.0.0:5000->5000/tcp   distracted_swirles

#启动 registry 镜像,同时使用-p 参数做端口映射,为了让外边的机器能通过映射的端口访问到这台容器,端口映射相关知识可以去百度了解一下
[root@am-01:~#] telnet 172.17.1.240 5000

Trying 172.17.1.240...

Connected to 172.17.1.240.

Escape character is '^]'.

^]

telnet> quit

Connection closed.

#测试这个端口映射是否成功,其中"Escape character is '^]'."的意思是按"ctrl + ]"就可以进入 telnet 窗口
[root@am-01:~#] curl 172.17.1.240:5000/v2/_catalog

{"repositories":[]}

#访问这个仓库,因为仓库还是空的,能看到没什么东西
[root@am-01:~#] docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

centos6             latest              d150b06d291a        3 days ago          553MB

am-centos           latest              daa937030543        3 days ago          269MB

ubuntu              latest              452a96d81c30        5 weeks ago         79.6MB

centos              latest              e934aafc2206        8 weeks ago         199MB

registry            latest              d1fd7d86a825        4 months ago        33.3MB

[root@am-01:~#] docker tag centos6 172.17.1.240:5000/centos6

[root@am-01:~#] docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

centos6                     latest              d150b06d291a        3 days ago          553MB

172.17.1.240:5000/centos6   latest              d150b06d291a        3 days ago          553MB

#给准备上传到私有仓库的镜像打一个特殊的标签
[root@am-01:~#] vim /etc/docker/daemon.json

{

  "registry-mirrors": ["https://vnarzvrd.mirror.aliyuncs.com"],

  "insecure-registries":["172.17.1.240:5000"]

}

[root@am-01:~#] systemctl restart docker.service

[root@am-01:~#] docker start 9b6f810388a0

9b6f810388a0

[root@am-01:~#] docker push 172.17.1.240:5000/centos6

The push refers to repository [172.17.1.240:5000/centos6]

dbcc6b3893af: Pushed

latest: digest: sha256:8a13bd1bd13498192230b08151670113c2175323987aa7f6770e4dcc0eb8352d size: 529

[root@am-01:~#] curl 172.17.1.240:5000/v2/_catalog

{"repositories":["centos6"]}

#在"/etc/docker/daemon.json"增加一句指定私有仓库地址,重启 docker

#把打了特殊标签的镜像上传到私有仓库,再次访问这个私有仓库,能看到刚上传的镜像

客户端从私有仓库中拉取镜像(am-02)

[root@am-02:~#] curl https://download.docker.com/linux/centos/docker-ce.repo -o  /etc/yum.repos.d/docker.repo

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current

                                 Dload  Upload   Total   Spent    Left  Speed

100  2424  100  2424    0     0    371      0  0:00:06  0:00:06 --:--:--   548

[root@am-02:~#] yum -y install docker-ce

[root@am-02:~#] systemctl start docker.service

[root@am-02:~#] vim /etc/docker/daemon.json

{

  "insecure-registries":["172.17.1.240:5000"]

}

[root@am-02:~#] systemctl restart docker.service

[root@am-02:~#] docker pull 172.17.1.240:5000/centos6

Using default tag: latest

latest: Pulling from centos6

3cba026fed25: Pull complete

Digest: sha256:8a13bd1bd13498192230b08151670113c2175323987aa7f6770e4dcc0eb8352d

Status: Downloaded newer image for 172.17.1.240:5000/centos6:latest

[root@am-02:~#] docker images

REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE

172.17.1.240:5000/centos6   latest              d150b06d291a        3 days ago          553MB

#客户端拉取镜像,需要先配置私有仓库地址,然后再拉取指定镜像

数据管理

正常情况下,当容器被删除和停止,数据也会被清除,所以为了安全性着想,建议在宿主机新建一个目录用来存放容器的数据

挂载本地的目录到容器里

[root@am-01:~#] docker run -itd -v /data/:/data centos6 bash

3fd13396878cbb9396088f1fcf8bd0ba89d42e30d7ed34ed9602cbc2575a8f79

[root@am-01:~#] ls /data/

ftp  gitroot  mariadb  mongodb  mysql  redis  redis2  redis_data  svnroot  wwwroot

[root@am-01:~#] docker exec -it 3fd1339 bash

[root@3fd13396878c /]# ls /data/

ftp      mariadb  mysql  redis2      svnroot

gitroot  mongodb  redis  redis_data  wwwroot

[root@3fd13396878c /]# mkdir /data/123

[root@3fd13396878c /]# exit

exit

[root@am-01:~#] ls /data/

123  ftp  gitroot  mariadb  mongodb  mysql  redis  redis2  redis_data  svnroot  wwwroot

#-v 参数用来指定挂载目录,:前面的/data/为宿主机本地目录,:后面的/data/为容器里的目录,会在容器中自动创建

#可以见到,宿主机的/data 目录和容器的/data 目录是相同的,并且是同步的

#使用了-v 参数并有冒号的方式,表示宿主机和容器做一个目录的映射,做映射的同时也会把这个目录共享出去

#-v 参数还有一种用法,就是不写宿主机目录,即不做映射,如:-v /data/,这样的用法则只把容器的目录共享出去,就如同 NFS 一样

#开启容器时,支持一次性挂载多个目录,使用多次-v

挂载数据卷容器

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

3fd13396878c        centos6             "bash"                   7 minutes ago       Up 7 minutes                                 jolly_jang

[root@am-01:~#] docker run -itd --volumes-from jolly_jang am-centos bash

ae6b89440dc124b6e74685cf650573a601cb5c6ad922191599beaf3645a542be

[root@am-01:~#] docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES

ae6b89440dc1        am-centos           "bash"                   14 seconds ago      Up 6 seconds                                 inspiring_hypatia

3fd13396878c        centos6             "bash"                   9 minutes ago       Up 9 minutes                                 jolly_jang

[root@am-01:~#] docker exec -it ae6b89 bash

[root@ae6b89440dc1 /]# ls /data/

123  gitroot  mongodb  redis   redis_data  wwwroot

ftp  mariadb  mysql    redis2  svnroot

[root@ae6b89440dc1 /]# exit

exit

#使用 am-centos 镜像创建新的容器,并且这个新的容器使用了 jolly_jang 容器的数据卷,即不需要使用-v 参数,也会挂载跟 jolly_jang 一样的本地目录

#"--volumes-from"是指定数据卷容器的意思