docker使用二(docker镜像、容器与仓库)

使用docker

一、使用docker镜像

docker运行容器前需要本地存在对应的镜像,如果镜像没有保存在本地,Docker会从默认的默认的镜像仓库下载镜像。

1、下载镜像

1)下载镜像

   下载镜像命令:docker pull NAME:[TAG]

   命令说明:NAME是镜像仓库的名称,TAG是镜像的标签(一般是版本信息)。

        选项:

                 -a (--all-tags=true|false):是否获取仓库中的所有镜像,默认为false

#下载最新版本的redis
root@docker-server:~# sudo docker pull redis 
......
#下载指定版本的redis
root@docker-server:~# sudo docker pull redis:3.2 
3.2: Pulling from library/redis
b0568b191983: Already exists 
6637dc5b29fe: Already exists 
7b4314315f15: Already exists 
3bc30a4dd0c2: Pull complete 
9446fed1509b: Pull complete 
939e50b6dd02: Pull complete 
Digest: sha256:fd310669f5f1be3d96cfe560264cacd5067d6b03b35764b608ada2db98be6208
Status: Downloaded newer image for redis:3.2
#不使用默认源,指定源下载镜像
root@docker-server:~# docker run -it hub.c.163.com/public/centos bash

       docker镜像文件一般是由若干层(layer)组成,类似”b0568b191983”这样的串时层的唯一ID(完整的ID包括256bit,由6416进制字符组成),使用docker pull下载时会获取并输出各层的信息。当不同的镜像包括相同的层时,本地仅存储层的一份内容。

2)搜索镜像

扫描二维码关注公众号,回复: 3108706 查看本文章

   使用docker search可以根据关键字去镜像仓库中搜索镜像,有点类似于”yum search”命令。

   语法:docker  search  [选项]  TERM

         常用选项:

                   --automated=true|false   仅显示自动创建的镜像,默认为false

                   --no-trunc=true|false     输出信息不截断显示,默认为false

                   -s(--stars=X)  指定仅显示评价为指定星级以上的镜像,默认为0

#搜索自动创建的评价为1+的当nginx关键字的镜像。
root@docker-server:~# docker search --automated -s 3 nginx
NAME         DESCRIPTION           STARS         OFFICIAL       AUTOMATED
jwilder/nginx-proxy   Automated Nginx reverse proxy for docker con…   1325                                    [OK]
richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable of…   547                                     [OK]
......

2、查看及操作镜像

1)查看本地已经下载的镜像

root@docker-server:~# docker images
REPOSITORY           TAG         IMAGE ID            CREATED        SIZE
hello-world         latest      e38bc07ac18e       2 weeks ago      1.85kB
nginx                latest      b175e7467d66       2 weeks ago      109MB
redis               latest        c5355f8853e4     4 weeks ago       107MB
redis               3.2           b05c3d76c8b3     6 weeks ago       99.7MB

       REPOSITORY代表来自哪个仓库,TAG为镜像的标签信息,IMAGE ID 为镜像的IDCREATED为镜像的创建时间, SIZE为镜像的大小。其中。镜像的ID唯一标识了镜像,一般可使用镜像ID前若干个字符串组成的可区分串来替代完整的ID.

2)查看镜像的详细信息

         查看语法:docker inspect NAME:[TAG]

root@docker-server:~# docker inspect redis:3.2
[
    {
        "Id": "sha256:b05c3d76c8b3ef3af8974edda3941a4a028d244681cc420e5304a3829519f1b6",
        "RepoTags": [
            "redis:3.2"
        ],
......

  输出的内容较多,如果只想获取某项内容时,可以使用-f来指定要输出的信息

#只输出版本信息
root@docker-server:~# docker inspect redis:3.2 -f {{".DockerVersion"}}
17.06.2-ce

3)查看镜像历史

        命令:docker history NAME:[TAG]

root@docker-server:~# docker history redis:3.2
IMAGE         CREATED       CREATED BY              SIZE            COMMENT
b05c3d76c8b3 6 weeks ago   /bin/sh -c #(nop)  CMD ["redis-server"]   0B                  
<missing>     6 weeks ago   /bin/sh -c #(nop)  EXPOSE 6379/tcp       0B   
......

       通过查看镜像历史,可以知道各个层的具体内容是什么;过长的内容会被截断,可通过参数”--no-trunc”来查看完整的命令。

       为镜像添加标签:为了方便镜像管理,可以使用tag命令为本地镜像添加标签,为镜像添加标签也就相当于为某个文件创建了一个硬连接,它们的镜像ID都是一样的。

#为在网易镜像源下载的镜像打标签
root@docker-server:~# docker tag hub.c.163.com/public/centos centos:6.5
root@docker-server:~# docker images
REPOSITORY        TAG            IMAGE ID         CREATED           SIZE
......
centos            6.5         997f0ed97903       2 years ago         442MB
hub.c.163.com/public/centos latest   997f0ed97903 2 years ago    442MB

3、删除镜像

  删除镜像时可以使用标签删除镜像,也可以使用镜像ID删除镜像。如果一个进镜像有多个标签时,使用标签删除时删除的只是指定标签,不影响镜像文件。当有镜像创建的容器存在时,镜像时无法删除的。

  语法:docker rmi image[TAG|IMAGE ID]

#使用标签删除镜像hub.c.163.com/public/centos:latest,因为有标签,删除时不会删除所有层,当时用ID删除时会删除所有层,
root@docker-server:~# docker rmi hub.c.163.com/public/centos:latest 
Untagged: hub.c.163.com/public/centos:latest
Untagged:hub.c.163.com/public/centos@sha256:75a27ccbfdef28456d98134cf04f2f41f76b435d9e62c678c6791af467d6b1b0
#使用标签删除镜像hub.c.163.com/public/centos:latest后,为其做的标签还是存在的
root@docker-server:~# docker images
REPOSITORY    TAG            IMAGE ID            CREATED         SIZE
centos         6.5           997f0ed97903        2 years ago     442MB
# 使用ID删除redis3.2
root@docker-server:~# docker rmi b05c3d76c8b3
Untagged: redis:3.2
Untagged:redis@sha256:fd310669f5f1be3d96cfe560264cacd5067d6b03b35764b608ada2db98be6208
Deleted:sha256:b05c3d76c8b3ef3af8974edda3941a4a028d244681cc420e5304a3829519f1b6
Deleted:sha256:c7310f74bc14105a3f09a921aeec7feb031f70a95be81ceacc42690efcdc146d
Deleted:sha256:7d7786b85eeb28eba62636c3088e535ddbe1640a9632aab550f9a58c0c011faa
Deleted:sha256:635b643d26091e3396661ab3b2e08d59110d5ecec236eb100168ced03cf7630b

4、导入和保存镜像

     docker镜像不仅可以通过docker仓库去下载,也可以将别人做好的镜像上传到服务器后导入,也可将自己做好的镜像保存在别的机器上导入使用。

1)导出镜像

         导出命令:docker save -o imagename.tar NAME:[TAG]

#将本地的镜像导出:
root@docker-server:~# docker save -o redis_latest.tar redis:latest
root@docker-server:~# ll

(2)导入镜像

  导入镜像命令:docker load --input imagename.tar

                            docker load < imagename.tar

#在别的机器上将导出的镜像导入
[root@ansible-server ~]# docker load --input redis_latest.tar 
43efe85a991c: Loading layer [==================================================>]  82.94MB/82.94MB
27af3b14aa14: Loading layer 
......

二、使用docker容器

     镜像是静态的只读文件,而容器带有运行时需要的可写文件层,即容器是镜像的一个运行实例。

1、创建运行容器

  创建容器的命令:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]

     常用选项:

               -d 在后台运行容器

               -l(--lable=[]):以键值对的方式指定容器的标签信息

               -label-file=[] :从文件中读取标签信息

               -i(--interactive=true|false) 保持标准输入打开,默认为false

              -P 通过NAT机制将容器标记暴露的端口自动映射到本地主机的临时端口

              -p 指定映射端口

              --rm=true|false 容器退出后,是否自动删除,不能和-d同时使用

              -t 是否分配一个伪终端,默认为false

              -v 挂载主机上的文件或目录到容器内

              --volumes-from=[] 从其他容器挂载卷

              -w(--workdir=””) 容器内的默认工作目录

              -e(--env=[]) 指定容器内的环境变量

              -h(--hostname=””)指定容器内的主机名

              --link=[<name or id>:alias] 连接到其他容器

              --name=”” 指定容器的别名

       这些选项与其他创建运行容器的选项基本时通用的。使用”docker create”创建容器时选项较多,有与容器运行模式相关的选项和与容器环境配置相关的选项,更多的选项可通过”docker create --help”命令查看。

1)使用docker create创建容器

#使用cetos6.5镜像创建一个容器
root@docker-server:~# docker create -it centos:6.5 
92d987bd067183058d7113678c73e91fc1f3bd12ec50058dcb184863160be721
#创建容器时可以给创建的容器指定名称创建,不指定名称系统会自动分配一个名称
root@docker-server:~# docker create --name webserver nginx
67f7ca43a4f414d3a04f14599cae3bf743c8bffb981115c37236383815d98fff

2)启动创建的容器

        使用docker create创建的容器并没有真正运行,需要通过start命令来启动。

       启动容器的命令:docker start [OPTIONS] CONTAINER [CONTAINER...]

#启动刚才创建的容器,启动容器时可以跟容器id或容器名称
root@docker-server:~# docker start 92d987bd0671
92d987bd0671
#查看容器的状态,已经处于up状态
root@docker-server:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND               CREATED             STATUS              PORTS               NAMES
92d987bd0671        centos:6.5          "/usr/sbin/sshd -D"   7 minutes ago       Up 11 seconds       22/tcp              keen_hugle

3)使用docker run创建并启动容器

         创建并启动容器相当于先创建了容器,并启动容器。

         创建并启动容器的命令:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 # 创建容器并执行命令输出“hello world”  
 root@docker-server:~# docker run centos:6.5 /bin/echo "hello world"
hello world
#创建centos6.5一个容器,并进入该容器的bash,当退出时,该容器也就终止了
root@docker-server:~# docker run -it centos:6.5 /bin/bash
[root@ab4b243f5e7b /]# 

 使用docker run创建并启动容器时,docker在后台运行的操作步骤如下:

         1)检查本地是否存在指定的镜像,没有则去仓库中下载。

         2)利用镜像创建一个容器,并启动该容器。

         3)分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层。

         4)从宿主机配置的网桥接口中桥接一个虚拟接口到容器中。

         5)从网桥的地址池配置一个ip地址给容器

         6)执行用户指定的应用程序,执行完成后容器被自动终止。

4)以守护进程的方式启动容器

   想让启动的容器在后台运行,可以通过-d”参数来实现,想要获取的输出信息时,可以通过docker logs命令获取。

# 以守护进程的方式创建一个容器并执行“ping”命令
root@docker-server:~# docker run -d centos:6.5 /bin/sh -c "ping 127.0.0.1"
e05ed3e2b2a87dc339cfd7c1b145885f75717e99e59fb69bcd3dea7ac10d13e6
# 查看正在运行的进程
root@docker-server:~# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e05ed3e2b2a8        centos:6.5          "/bin/sh -c 'ping 12…"   13 seconds ago      Up 12 seconds       22/tcp              infallible_neumann
#获取容器的输出信息
root@docker-server:~# docker logs  e05ed3e2b2a8
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.166 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.088 ms
......

2、停止容器

  当docker容器中指定的应用终结时,该容器会自动终止。对于一个运行的容器,也可以通过命令停止该容器。

  终止容器命令:docker stop [OPTIONS] CONTAINER [CONTAINER...]

  杀死正在运行容器:docker kill [OPTIONS] CONTAINER [CONTAINER...]

  重启正在运行的容器:docker restart [OPTIONS] CONTAINER [CONTAINER...]

#查看正在运行的容器
root@docker-server:~# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
e05ed3e2b2a8        centos:6.5          "/bin/sh -c 'ping 12…"   18 hours ago        Up 18 hours         22/tcp              infallible_neumann
# 杀死正在运行的容器cetos:6.5
root@docker-server:~# docker kill e05ed3e2b2a8
e05ed3e2b2a8

3、进入容器

    当通过”-d”参数让容器在后台运行时,想进入容器时,可通过如下的方法进入容器。

1)使用attach命令进入容器

        attachdocker自带的进入容器的命令。

        attach命令用法:docker attach [OPTIONS] CONTAINER

        选项:

            --detach-keys string 指定退出attach的快捷键,默认是”ctrl + q”

            --no-stdin  是否关闭标准输入,默认是打开的

            --sig-proxy  是否收的的系统信号给应用进程,默认是true

#查看正在运行的容器
root@docker-server:~# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a3a96c24980c        centos:6.5          "/bin/bash"         13 seconds ago      Up 12 seconds       22/tcp              elegant_swartz
#进入容器
root@docker-server:~# docker attach elegant_swartz 

  使用attach进入正在运行的容器,当多个窗口同时使用attach连接到同一个容器的时候,所有窗口会同步显示。当退出时,容器是正常运行的。

2)使用exec命令进入容器

        execdocker1.3版本后增加的新命令,使用该命令可以直接在容器内执行任意命令。

        exec命令的用法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

选项:-i  打开标准的输入,接受用户输入命令

          -t  分配伪终端

          -u  执行命令的用户名或id

          --privileged 是否以最高权限执行命令

# 进入容器执行/bin/bash
root@docker-server:~# docker exec -it a3a96c24980c /bin/bash

3)使用nsenter进入容器

   在使用nsenter进入容器需要使用系统中的nsenter命令,系统中如果没有此命令则需要安装“util-linux”软件包。在使用nsenter进入容器时,需要找到容器进程的pid,然后通过容器进程的pid连接到容器。

   获取PID的命令:docker inspect --format "{{ .State.Pid }}" <CONTAINER ID>

   通过nsenter进入docker命令:nsenter --target ${PID} --mount --uts --ipc --net --pid

# 获取容器的PID号
root@docker-server:~# docker inspect --format "{{ .State.Pid }}" a3a96c24980c
35916
#进入容器
root@docker-server:~# nsenter --target 35916 --mount --uts --ipc --net --pid 
# 也可以通过写脚本传参的方式进入进入容器,脚本内容:
#!/bin/bash
PID=`docker inspect --format "{{ .State.Pid }}" $1`
nsenter --target $PID --mount --uts --ipc --net --pid 

4、删除容器

     当一个容器在完成他的使命后,可以删除该容器。

  删除容器的命令用法:docker rm [OPTIONS] CONTAINER [CONTAINER...]

  常用选项:

            -f 强行终止并删除一个运行中的容器

            -l 删除容器的链接,但保留容器

            -v 删除容器挂载的数据卷。

# 删除一个没有运行的容器
root@docker-server:~# docker rm 41e67bedabcc
41e67bedabcc
# 删除一个正在运行的容器,不加参数无法删除
root@docker-server:~# docker rm 1a50352a2b82
Error response from daemon: You cannot remove a running container 1a50352a2b82765ad0470a146f8979f8b1d24096b7c1add069c2bb2614856f6a. Stop the container before attempting removal or force remove
# 强制删除一个正在运行的容器
root@docker-server:~# docker rm -f 1a50352a2b82
1a50352a2b82

5、导入和导出容器

1)导出容器

        导出容器是指导出一个已经创建的容器到一个文件,不管此时该该容器是否运行,都可以导出。

   导出容器的命令: docker export [OPTIONS] CONTAINER

   选项: -o  指定导出的tar文件名

root@docker-server:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
af4ea76aec58        redis               "docker-entrypoint.s…"   5 seconds ago        Up 3 seconds        6379/tcp            boring_yalow
d48dae0851d4        nginx  
# 将正在运行的nginx容器导出
root@docker-server:~# docker export -o nginx_run.tar d48dae0851d4
#使用重定向的方式将正在运行的redis容器导出
root@docker-server:~# docker export af4ea76aec58 > redis_run.tar
#查看导出的容器
	root@docker-server:~# ll
-rw-------  1 root root 110975488 Apr 30 18:33 nginx_run.tar
-rw-r--r--  1 root root 107744768 Apr 30 18:35 redis_run.tar

2)导入容器

   导入容器是指将导出的容器导入变为镜像,导入容器既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可使用docker image命令来导入。

   导入容器的命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

#将容器导入为镜像
root@docker-server:~# docker import redis_run.tar redis:1.0       
sha256:11f4bc0c344ccffc72c3a0245bed9a250a357fc8b5436c8f88a3d599ef64b6cf

三、docker仓库

      docker仓库是集中存放镜像的地方,有公有仓库和私有仓库。

1、docker公有仓库

     docker hub时是由docker官方维护的最大的公有仓库,下载镜像时默认会从dockerhup上去下载。

  根据docker镜像是否由官方提供,可将docker镜像分为两类,一类是基础镜像,由docker公司创建、验证、支持、提供,这样的镜像往往使用单个单词作为名称。还有一类是由docker用户创建并维护的,带有用户名称为前缀,表名是某用户下的某仓库,一般使用“用户名前缀/镜像名”来指定某个用户提供的镜像。

1)使用国内镜像

       由于docker hub站点在国外,下载镜像时受网络影响,下载速度慢。此时我们可以使用国内的docker仓库下载docker镜像。

国内常用站点有:

    时速云:index.tenxcloud.com

             docker官方中国区:registry.docker-cn.com

             daocloudhub.daocloud.io

    网易镜像地址:hub.c.163.com

             ustc:docker.mirrors.ustc.edu.cn

             阿里云:dev.aliyun.com

#指定仓库地址下载镜像
root@docker-server:~# docker pull hub.c.163.com/public/ubuntu:16.04

2)配置docker仓库地址

   在使用docker下载镜像时,可以直接在修改docker配置文件,将镜像地址设置为国内镜像。

# 将docker仓库地址更改为国内镜像地址
root@docker-server:~# cat /etc/docker/daemon.json 
{"registry-mirrors": ["http://ef017c13.m.daocloud.io"]}
# 更改完成后需要重启docker
root@docker-server:~# systemctl restart docker

2、搭建本地私有仓库

1)搭建本地私有仓库

   安装docker后,可通过docker官方提供的registry镜像来搭建一套本地私有仓库环境。

   搭建本地私有仓库,默认情况下会将仓库创建在容器的/tmp/registry目录下,我们可通过-v参数为容器挂载一个数据卷,将本地的目录挂载给镜像,通过-p参数为镜像映射一个本地端口,以便访问。

# 搭建一个本地的私有仓库,将本地的5000端口映射到容器内的5000端口,并将本地的/data/registry映射到容器中用于存放镜像
root@docker-server:~# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry

2)管理本地私有仓库

#再讲镜像上传到Registry之前,需要指定新的Registry目的地址,需要在镜像名前加上
主机名和端口的前缀
root@docker-server:~# docker tag tomcat 127.0.0.1:5000/node/tomcat
#将本地的镜像上传到私有仓库
root@docker-server:~# docker push 127.0.0.1:5000/node/tomcat
The push refers to repository [127.0.0.1:5000/node/tomcat]
babe368634ca: Pushed 
18e0b24a75fc: Pushed 
a879290dfdd6: Pushed 
#从本地的仓库中下载镜像
root@docker-server:~# docker pull 127.0.0.1:5000/node/tomcat  
#修改docker仓库地址为自己私有仓库地址
root@docker-server:~# cat /etc/docker/daemon.json 
{"insecure-registries": ["127.0.0.1:5000"]}
root@docker-server:~# systemctl restart docker
# 直接从本地的仓库中下载镜像
root@docker-server:~# docker pull 127.0.0.1:5000/node/redis
Using default tag: latest
latest: Pulling from node/redis
Digest: sha256:1ef524b87f3c9d41abe8df0321a7315d49a116f592e2a77dc79a3e9919ac6c76
Status: Downloaded newer image for 127.0.0.1:5000/node/redis:latest


猜你喜欢

转载自blog.csdn.net/dayi_123/article/details/80257409
今日推荐