诺志
软硬件开发技术笔记
docker初体验 - Docker安装/镜像下载/容器运行
2017-07-31

最近需要将docker和公司的存储产品对接,所以有机会接触下docker,简单用了下发现确实比起虚拟机有自己的优势,怪不得这么火。这篇文章简单记录下在centos7.2上安装和使用docker的过程

安装docker

# yum install docker

在安装docker的过程中,有提示Cannot connect to the Docker daemon. Is the docker daemon running on this host?,但是整个安装过程还是可以顺利走下来。

  Installing : 1:skopeo-containers-0.1.20-2.el7.x86_64                                                                                          26/44 
  Installing : libseccomp-2.3.1-2.el7.x86_64                                                                                                    27/44 
Stopping containers...
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
"docker stop" requires at least 1 argument(s).
See 'docker stop --help'.

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]

Stop one or more running containers
  Installing : 2:docker-1.12.6-32.git88a4867.el7.centos.x86_64                                                                                  28/44 
  Updating   : audit-2.6.5-3.el7_3.1.x86_64               

启动docker服务

yum进度完成后,看一下上面的报错到底怎么回事,首先查看docker所拥有的服务

# ll /usr/lib/systemd/system/*docker*
-rw-r--r--. 1 root root  192 7月   3 10:37 /usr/lib/systemd/system/docker-cleanup.service
-rw-r--r--. 1 root root  170 7月   3 10:37 /usr/lib/systemd/system/docker-cleanup.timer
-rw-r--r--. 1 root root 1139 7月   3 10:41 /usr/lib/systemd/system/docker.service
-rw-r--r--. 1 root root  242 7月   3 12:03 /usr/lib/systemd/system/docker-storage-setup.service

发现服务并没有启动

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: http://docs.docker.com

手动启动服务, 同时设置docker为开机自动启动

# systemctl start docker
# systemctl enable docker
# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 五 2017-07-21 07:18:57 EDT; 1s ago
     Docs: http://docs.docker.com
 Main PID: 2443 (dockerd-current)
   CGroup: /system.slice/docker.service
           ├─2443 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-o...
           └─2450 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --shim docker-containerd-shim -...

7月 21 07:18:57 dev40 dockerd-current[2443]: time="2017-07-21T07:18:57.370250215-04:00" level=info msg="Graph migration to content-address...seconds"

搜索镜像

docker有着和github类似的公网仓库,docker的官方镜像就放在上面,当然并不是一定要从公网的官方仓库下载镜像,也可以自己搭建内网仓库,其实和git差不多。你可以从github.com拉代码,你可以自己搭建git服务是一样的。

使用docker search 可以搜索远端仓库中共享的镜像,默认搜索docker hub官方仓库中的镜像

# docker search ceph
INDEX       NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/ceph/daemon                Image containing all the Ceph daemons           47                   [OK]
docker.io   docker.io/ceph/demo                                                                  15                   [OK]
docker.io   docker.io/ceph/base                  Ceph base image                                 10                   [OK]
docker.io   docker.io/ceph/osd                   Ceph OSD (object storage daemon)                8                    [OK]
docker.io   docker.io/ceph/radosgw               Ceph RADOSGW (S3/Swift-like service for Ceph)   5                    [OK]
docker.io   docker.io/ceph/config                Ceph bootstrap (configuration)                  3                    [OK]
docker.io   docker.io/ceph/mds                   Ceph MDS (metadata server)                      3                    [OK]
docker.io   docker.io/ceph/rbd                   Ceph rbd (RADOS block device) CLI tool          3                    [OK]
docker.io   docker.io/cdxvirt/ceph-daemon        All-in-one container for cdxvirt ceph core...   2                    [OK]
docker.io   docker.io/ceph/mon                   Ceph MON (monitor daemon)                       2                    [OK]
docker.io   docker.io/ceph/rados                 Ceph rados (reliable autonomic distributed...   2                    [OK]
docker.io   docker.io/crapworks/ceph-dash        This is the dockerized version of ceph-das...   2                    [OK]
docker.io   docker.io/ulexus/ceph-osd            DEPRECATED:  development is now at ceph/osd     2                    [OK]
docker.io   docker.io/ceph/install-utils         Install wrappers for common Ceph utility p...   1                    [OK]
docker.io   docker.io/farcaller/ceph                                                             1                    [OK]
docker.io   docker.io/h0tbird/ceph               Containerized Ceph distributed file system      1                    [OK]
docker.io   docker.io/cephbuilder/ceph           Docker image for building custom Ceph daem...   0                    [OK]
docker.io   docker.io/davedamoon/ceph-docker     ceph-docker                                     0                    
docker.io   docker.io/dippynark/ceph-daemon      Image containing all the Ceph daemons           0                    
docker.io   docker.io/gambol99/ceph-config                                                       0                    [OK]
docker.io   docker.io/knowpd/ceph                ceph-docker variants                            0                    
docker.io   docker.io/lorieri/registry-ceph      Ceph Rados Gateway (and any other S3 compa...   0                    
docker.io   docker.io/ulexus/ceph-mon            DEPRECATED:  development is now at ceph/mon     0                    [OK]
docker.io   docker.io/xenopathic/ceph-keystone   Automated full-stack Ceph environment with...   0                    [OK]
docker.io   docker.io/zakupka/ceph                                                               0                    

下载镜像

当服务器可以访问外网时,直接使用pull命令下载镜像时,默认从https://hub.docker.io下载, 如果使用其他源下载,则使用docker pull url/image_name[:tag]的方式下载

# docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ... 
latest: Pulling from docker.io/library/centos
7b6bb4652a1b: Pull complete 
Digest: sha256:c1010e2fe2b635822d99a096b1f4184becf5d1c98707cbccae00be663a9b9131

如果没有指定tag, 则默认tag为latest即最新版本,比如上面拉下来的centos是7.4,但是如果要下载7.2的centos,则需要指定tag
具体image支持那些tag需要到对应的网站查询,比如centos的tag说明

# 提供以下命令,可以拉起指定版本为7.2的操作系统镜像
# docker pull docker.io/centos:7.2.1511

查看当前环境所拥有的docker镜像,可以发现这个镜像非常小

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos    latest              36540f359ca3        2 weeks ago         192.5 MB

各个字段的解释

REPOSITORY: 表示来自于哪个仓库,比如CENTOS 仓库
TAG:        镜像的标签信息,比如LATEST
IMAGE ID:   镜像的ID号,唯一
CREATED:    创建时间
SIZE:       镜像大小

运行容器

镜像和容器的关系: 容器就是运行起来的镜像。

# docker run -ti docker.io/centos /bin/bash
[root@09fbc3ed8263 /]#          # 此时已经进入到容器里面的shell终端了
-ti              : 用于可以和容器里面进行交互 
docker.io/centos : 刚才下载的镜像,可以通过docker images获取到
/bin/bash        : 就是容器运行后,执行的命令,这里指定为bash意味着可以运行容器里面的shell

生成自定义镜像

进入到容器里面,就和操作linux差不多了,你可以在这里面安装自己的业务,比如我在/root下创建的了一个test文件

[root@09fbc3ed8263 ~]# echo "hi" > test
[root@09fbc3ed8263 ~]# ll
total 12
-rw-------. 1 root root 3407 Jul  5 17:16 anaconda-ks.cfg
-rw-------. 1 root root 3221 Jul  5 17:16 original-ks.cfg
-rw-r--r--. 1 root root    3 Jul 31 21:44 test

在退出容器前,可以通过docker ps命令,查看正在运行的容器

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
09fbc3ed8263        docker.io/centos    "/bin/bash"         2 minutes ago       Up 2 minutes                            boring_nobel

当使用exit退出容器后,这个容器就已经停止了,只能通过docker ps -a查看到当时的容器的运行状态

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
09fbc3ed8263        docker.io/centos    "/bin/bash"         4 minutes ago       Exited (0) 5 seconds ago                       boring_nobel

此时再通过docker run -ti docker.io/centos /bin/bash启动容器,发现之前创建的test文件已经不在了。此处正是docker和虚拟机不同的地方,虚拟机每次启动后的任何修改,都会持久化到虚拟机的镜像文件中,而docker每次启动容器,实际上是docker镜像的一个copy,每个容器的更改都不会影响docker镜像。

如果需要保留容器内的修改,docker的做法是基于那个容器创建一个新的镜像

# 查看历史容器运行记录
# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
09fbc3ed8263        docker.io/centos    "/bin/bash"         8 minutes ago       Exited (0) 7 minutes ago                        pedantic_joliot

# 基于一个历史容器记录,创建一个新的镜像,其中09fbc3ed8263是通过docker ps -a获取到的CONTAINER ID字段值
# docker commit -m "add a new file" -a "maming"  09fbc3ed8263  myself-images
sha256:0a4caf6950ec974b177264e86b9a0dc41b5531c8f47675d716966b66202662be

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myself-images       latest              0a4caf6950ec        5 seconds ago       194.2 MB
docker.io/centos    latest              36540f359ca3        3 weeks ago         192.5 MB

# 使用新的镜像启动
# docker run -ti myself-images /bin/bash

# 发现文件还在
[root@947dc1c847d0 /]# cat /root/test 
hi
[root@947dc1c847d0 /]# 

设置ipv4转发

有些镜像启动的时候,可以有WARNING: IPv4 forwarding is disabled. Networking will not work.这样的提示,启动的容器是无法联网的,因此建议docker宿主机设置ipv4转发

# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p

上传镜像

你也把自己创建好的镜像推到网上,过程类似github,需要先到docker.io上创建账号

# docker login
# docker tag 0a4caf6950ec docker.io/user_name/test
# docker push user_name/test
分类
2篇
c
1篇
8篇
18篇
8篇
2篇
搜索