最近需要将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