软硬件开发技术笔记
保持专注,拒绝内耗
docker基本使用
2022-01-16 12:11

本文简单记录下在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" }
分类
mac
1篇
4篇
c
1篇
4篇
2篇
1篇
搜索