本文简单记录下在centos7.6 1801上安装和使用docker的过程
1. 基础环境准备
1.1 操作系统
以centos7.6minimal安装(最小化安装)为基础环境
1.2 yum源配置
默认使用操作系统自带的源也可以,不过下载包可能比较慢,本文使用aliyun的源替代操作系统自带源
# mkdir /etc/yum.repos.d/back
# mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/back
# curl http://mirrors.aliyun.com/repo/Centos-7.repo > /etc/yum.repos.d/Centos-7.repo
# curl http://mirrors.aliyun.com/repo/epel-7.repo > /etc/yum.repos.d/epel.repo
# yum makecache
2. 安装docker
2.1 安装软件包
# yum install docker
2.2 启动docker服务,并设置开机自动启动
# systemctl start docker
# systemctl enable docker
3. 搜索和镜像
3.1 搜索镜像
docker有着和github类似的公网仓库,docker的官方镜像就放在上面
当然并不是一定要从公网的官方仓库下载镜像,也可以自己搭建内网仓库
其实和git差不多,你可以从github.com拉代码,你可以自己搭建git服务是一样的
使用docker search 可以搜索远端仓库中共享的镜像,默认搜索docker hub官方仓库中的镜像
以搜索ceph镜像为例
# docker search ceph
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/ceph/daemon Image containing all the Ceph daemons 114 [OK]
docker.io docker.io/ceph/ceph ceph base images 42
docker.io docker.io/rook/ceph File, Block, and Object Storage Services f... 17
docker.io docker.io/digitalocean/ceph_exporter Prometheus exporter that scrapes meta info... 5
docker.io docker.io/crapworks/ceph-dash This is the dockerized version of ceph-das... 4 [OK]
docker.io docker.io/ceph/daemon-base 3
docker.io docker.io/cdxvirt/ceph-daemon All-in-one container for cdxvirt ceph core... 2 [OK]
docker.io docker.io/ceph/ceph-grafana the ceph-grafana container provides a graf... 2
docker.io docker.io/ulexus/ceph-osd DEPRECATED: development is now at ceph/osd 2 [OK]
docker.io docker.io/farcaller/ceph 1 [OK]
docker.io docker.io/kapiteined/cephosd 1
docker.io docker.io/rook/ceph-toolbox 1
docker.io docker.io/amk3798/ceph cephadm testing 0
docker.io docker.io/ceph/ceph-amd64 ceph-amd64 0
docker.io docker.io/ceph/ceph-arm64 ceph-arm64 0
docker.io docker.io/cristicalin/ceph_exporter Ceph exporters for prometheus 0
docker.io docker.io/fernandosanchez/ceph-dash ceph-dash for DC/OS 0 [OK]
docker.io docker.io/kapiteined/cephmds 0
docker.io docker.io/kapiteined/cephmon 0
docker.io docker.io/knowpd/ceph ceph-docker variants 0
docker.io docker.io/openstackhelm/ceph-config-helper 0
docker.io docker.io/owncloudci/ceph Docker images for Ceph 0
docker.io docker.io/port/ceph-config-helper 0
docker.io docker.io/s7799653/cephfs-provisioner quay.io/external_storage/cephfs-provisione... 0
docker.io docker.io/xenopathic/ceph-keystone Automated full-stack Ceph environment with... 0 [OK]
3.2 下载镜像
直接使用pull命令下载镜像时,默认从https://hub.docker.io下载
如果使用其他源下载,则使用docker pull url/image_name[:tag]的方式下载
此处以下载centos镜像为例
# docker pull docker.io/centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for docker.io/centos:latest
3.3 下载指定版本的镜像
如果没有指定tag, 则默认tag为latest即最新版本,比如上面拉下来的centos是8.4
但是如果要下载7.6的centos,则需要指定tag,tag可以认为是release版本
具体image支持那些tag可以到https://hub.docker.com
搜索centos
后查询
如下,指定版本为7.6的操作系统镜像
# docker pull centos:centos7.6.1810
Trying to pull repository docker.io/library/centos ...
centos7.6.1810: Pulling from docker.io/library/centos
ac9208207ada: Pull complete
Digest: sha256:62d9e1c2daa91166139b51577fe4f4f6b4cc41a3a2c7fc36bd895e2a17a3e4e6
Status: Downloaded newer image for docker.io/centos:centos7.6.1810
查看当前环境所拥有的docker镜像,可以发现这个镜像非常小
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 5d0da3dc9764 4 months ago 231 MB
docker.io/centos centos7.6.1810 f1cb7c7d58b7 2 years ago 202 MB
各个字段的解释
REPOSITORY: 表示来自于哪个仓库,比如CENTOS 仓库
TAG: 镜像的标签信息,比如LATEST
IMAGE ID: 镜像的ID号,唯一
CREATED: 创建时间
SIZE: 镜像大小
4 .运行容器
4.1 直接运行容器
镜像和容器的关系: 容器就是运行起来的镜像
# docker run -ti docker.io/centos /bin/bash
正常应该有类似以下的输出,即shell提示符变为一个随机数,实际为随机主机名
进入后可以执行容器内的程序,注意不能exit
退出,如果退出,容器会一起关闭
除非是以后面章节讲的以daemon
方式运行
# docker run -ti docker.io/centos /bin/bash
[root@34703389d6be /]#
参数解释
-ti : 启用终端,用于可以和容器里面进行交互
docker.io/centos : 刚才下载的镜像,可以通过docker images获取到
/bin/bash : 就是容器运行后,执行的命令,这里指定为bash意味着可以运行容器里面的shell
可以打开另外一个终端通过docker ps -a
可以看到容器STATUS
状态为Up xxxx
就说明启动成功
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
34703389d6be docker.io/centos "/bin/bash" 2 minutes ago Up 2 minutes determined_fermi
4.2 以守护进程的方式运行daemon
上面的方法当用户从容器退出后,容器会一并退出,即容器关闭,以这种方式运行的容器一般用在完成一次特定任务后就退出的业务场景,无需保持状态
比如容器里面的运行的程序是某个加密算法,用户启动容器执行完加密算法得到结果后,容器就没有用了,此时容器就可以退出了,即用即停
但是在一些其他场景需要容器持续运行,就需要将容器以deamon的方式运行,比如容器里面运行的是http服务或者mysql服务
以daemon方式启动,只要加-d
参数即可
此时并没有和不加-d参数会进入容器一样,只是返回了一个ID
# docker run -d -ti docker.io/centos /bin/bash
aa6507acec780d2ccb9faf7d1a98bf0d6dc2c9612f465a54285fc057af759b75
#
继续查看容器状态,可以看到上述id开头的容器保持up
状态
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa6507acec78 docker.io/centos "/bin/bash" 3 seconds ago Up 2 seconds kind_edison
如果用户需要进入容器,执行以下命令即可,且并不会因为用户exit后容器也退出
# docker exec -it aa6507acec78 /bin/bash
参数解释:
--it : 分配终端,用于可以shell进入容器执行命令
aa6507acec78 : 通过docker ps确定的容器ID
/bin/bash : 进入容器的入口,即进入容器后执行的动作
5. 容器状态维护
5.1 启动、停止容器
以daemon(-d)方式启动的容器可以通过docker stop
/dcoker start
停止启动容器
# docker stop aa6507acec78
aa6507acec78
# docker start aa6507acec78
aa6507acec78
5.2 删除容器
如果容器是up状态,需要通过-f参数强制删除
# docker rm aa6507acec78 -f
6. 其他略微深入的用法
本章抛砖引玉,简单挑几个比较常用的深入用法
6.1 基于一个历史容器记录,创建一个新的镜像
docker的创建容器命令是docker run
会给人以运行的概念,实际run可以简单理解为创建新的镜像拷贝后启动容器,因此每次run启动后的容器和前一个修改后的容器内容没有关系
可以对自己使用后的容器进行修改后,产生新的镜像供以后使用,类似对虚拟机做快照,以后再创建虚拟机可以通过这个快照创建
其中aa6507acec78是通过docker ps -a获取到的CONTAINER ID字段值
# docker commit -m "add a new file" -a "maming" aa6507acec78 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
# 你可以把自己创建好的镜像推到网上,过程类似github,需要先到docker.io上创建账号
# docker login
# docker tag 0a4caf6950ec docker.io/user_name/test
# docker push user_name/test
6.2 向容器中拷贝文件
从宿主机拷文件到容器
# docker cp file aa6507acec78:/root
从容器烤文件到宿主机
# docker cp aa6507acec78:/root/file /home
6.3 容器联网
容器内的应用如果需要联网,需要在docker宿主机设置ipv4转发,否则会提示 WARNING: IPv4 forwarding is disabled. Networking will not work.
# echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# sysctl -p
6.4 其他更多参数
启动一个参数较多的容器
# docker run --name pds --hostname centos-test --net=host -v /dev:/dev --privileged -it -d docker.io/centos /usr/sbin/init
参数解释:
--name : 指定容器名称, docker ps -a时用于识别容器,否则将随机生成名字
--hostname : 指定容器里面显示的主机名
--net : 指定和宿主机共享网络,否则容器里面看不到宿主机上的ip地址
-v : 将宿主机的/dev目录共享给容器,否则容器内不能实时获取/dev下设备包括分区在内的更新
--privileged : 给予容器最高权限
--it : 分配终端,用于可以shell进入容器执行命令
-d : 以daemon方式运行容器,意味着从容器exit后,容器不会自动停止
/usr/sbin/init : 容器启动时的程序入口,指定为init目的为可以在使用systemd服务
7. windows下使用docker
windows使用docker的说明网上很容易搜,使用体验也不错,遇到个小问题,就是在使用ctrl+p
向上翻页shell命令需要执行2次
这个是因为docker在windows下ctrl+p
有特殊的用途,用于退出容器
可通过编辑以下文件,将退出功能改成别的按键,.docker/config.json
文件夹和文件默认不存在,需要创建
~/.docker/config.json
{ "detachKeys": "ctrl-e,e" }