BoyChai's Blog - 容器 2023-01-12T14:30:00+00:00 Typecho https://blog.boychai.xyz/index.php/feed/atom/tag/%E5%AE%B9%E5%99%A8/ <![CDATA[Containerd-容器管理]]> https://blog.boychai.xyz/index.php/archives/47/ 2023-01-12T14:30:00+00:00 2023-01-12T14:30:00+00:00 BoyChai https://blog.boychai.xyz Containerd概述

什么是Containerd

Containerd是一个行业标准的容器运行时,强调简单性、健壮性和可移植性。它可以作为Linux和Windows的守护进程使用,它可以管理其主机系统的完整容器生命周期:映像传输和存储、容器执行和监督、低级存储和网络附件等。

Docker和Containerd的关系

最开始ContainerdDocker的一部分,但是Docker的公司把Containerd剥离出来并捐赠给了一个开源社区(CNCF)独发展和运营。阿里云,AWS, GoogleIBMMicrosoft将参与到Containerd的开发中。

为什么要学习Containerd

kubernetes在1.5版本就发布了CRI(Container Runtime Interface)容器运行时接口,但是Docker是不符合这个标准的,Docker在当时又占据了大部分市场直接弃用Docker是不可能的,所以当时kubernetes单独维护了一个适配器(dockershim)单独给Docker用。

Docker的功能有很多,实际kubernetes用到的功能只是一小部分,而那些用不到的功能半身就可能带来安全隐患。

在1.20版本就发消息打算弃用Docker不再默认支持Docker当容器运行时。

在1.24版本正式弃用(移除dockershim)。在1.24之后的版本如果还想使用Docker作为底层的容器管理工具则需要单独安装dockershim

Containerd是支持CRI标准的,所以自然也就将容器运行时切换到Containerd上面了。

安装Containerd

YUM

直接使用docker的镜像源安装即可。

[root@host ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
[root@host ~]# yum -y install containerd.io 
......
[root@host ~]# rpm -qa containerd.io
containerd.io-1.6.15-3.1.el8.x86_64

使用下面命令设置开机自启并启动containerd

systemctl enable --now containerd

二进制

安装包

Containerd有两种安装包,区别如下

  • 第一种是containerd-xxx,这种包用于单机测试没问题,不包含runC,需要提前安装。
  • 第二种是cri-containerd-cni-xxxx,包含runc和k8s里的所需的相关文件。k8s集群里面需要用到此包。虽然包含runC,但是依赖系统中的seccomp(安全计算模式,用来限制系统资源的模式)

本文采用第二种包进行安装。

获取安装包

下载地址:Github

本文采用的版本是cri-containerd-cni-1.6.15-linux-amd64.tar.gz

下载好上传到服务器里面即可

[root@host ~]# mkdir containerd
[root@host ~]# mv cri-containerd-cni-1.6.15-linux-amd64.tar.gz containerd/
[root@host ~]# cd containerd
[root@host containerd]# tar xvf cri-containerd-cni-1.6.15-linux-amd64.tar.gz 
[root@host containerd]# ls
cri-containerd-cni-1.6.15-linux-amd64.tar.gz  etc  opt  usr

手动安装

[root@host containerd]# cp ./etc/systemd/system/containerd.service /etc/systemd/system/
[root@host containerd]# cp usr/local/sbin/runc /usr/sbin/
[root@host containerd]# cp usr/local/bin/ctr /usr/bin/
[root@host containerd]# cp ./usr/local/bin/containerd /usr/local/bin/
[root@host containerd]# mkdir /etc/containerd
[root@host containerd]# containerd config default > /etc/containerd/config.toml

修改配置

[root@host containerd]# cat /etc/containerd/config.toml |grep sandbox
    sandbox_image = "registry.k8s.io/pause:3.6"

这个参数是指向了一个镜像地址,这个地址在国内是被墙的,通过下面命令替换,下面的地址是我在dockerhub上面做的副本。

[root@host containerd]# sed -i 's/registry.k8s.io\/pause:3.6/docker.io\/boychai\/pause:3.6/g' /etc/containerd/config.toml 
[root@test containerd]# cat /etc/containerd/config.toml |grep sandbox_image
    sandbox_image = "docker.io/boychai/pause:3.6"

启动服务

[root@host containerd]# systemctl enable --now containerd
Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /etc/systemd/system/containerd.service.
[root@host containerd]# ctr version
Client:
  Version:  v1.6.15
  Revision: 5b842e528e99d4d4c1686467debf2bd4b88ecd86
  Go version: go1.18.9

Server:
  Version:  v1.6.15
  Revision: 5b842e528e99d4d4c1686467debf2bd4b88ecd86
  UUID: ebf1fe8b-37f7-4d94-8277-788e9f2c2a17
[root@test containerd]# runc -v
runc version 1.1.4
commit: v1.1.4-0-g5fd4c4d1
spec: 1.0.2-dev
go: go1.18.9
libseccomp: 2.5.1

镜像管理

帮助信息

[root@host ~]# ctr images -h
NAME:
   ctr images - manage images

USAGE:
   ctr images command [command options] [arguments...]

COMMANDS:
   check                    check existing images to ensure all content is available locally
   export                   export images
   import                   import images
   list, ls                 list images known to containerd
   mount                    mount an image to a target path
   unmount                  unmount the image from the target
   pull                     pull an image from a remote
   push                     push an image to a remote
   delete, del, remove, rm  remove one or more images by reference
   tag                      tag an image
   label                    set and clear labels for an image
   convert                  convert an image

OPTIONS:
   --help, -h  show help
命令概述
check检查镜像
export导出镜像
import导入镜像
list,ls列出镜像
mount挂载镜像
unmount卸载镜像
pull下载镜像
push推送镜像
delete,del,remove,rm删除镜像
tag修改标记
label修改标签
convert转换镜像

images可以使用简写 例如列出帮助信息"ctr i -h"

下载镜像

containerd支持OCI标准的镜像,所以可以用dockerhub中的镜像或者dockerfile构建的镜像。

ctr i pull 镜像名称

[root@host ~]# ctr images pull docker.io/library/nginx:alpine
docker.io/library/nginx:alpine:                                                   resolved       |++++++++++++++++++++++++++++++++++++++| 
index-sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6:    exists         |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:c1b9fe3c0c015486cf1e4a0ecabe78d05864475e279638e9713eb55f013f907f: exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:c7a81ce22aacea2d1c67cfd6d3c335e4e14256b4ffb80bc052c3977193ba59ba:    done           |++++++++++++++++++++++++++++++++++++++| 
config-sha256:c433c51bbd66153269da1c592105c9c19bf353e9d7c3d1225ae2bbbeb888cc16:   exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:8921db27df2831fa6eaa85321205a2470c669b855f3ec95d5a3c2b46de0442c9:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:83e90619bc2e4993eafde3a1f5caf5172010f30ba87bbc5af3d06ed5ed93a9e9:    done           |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:d52adec6f48bc3fe2c544a2003a277d91d194b4589bb88d47f4cfa72eb16015d:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:10eb2ce358fad29dd5edb0d9faa50ff455c915138fdba94ffe9dd88dbe855fbe:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:a1be370d6a525bc0ae6cf9840a642705ae1b163baad16647fd44543102c08581:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:689b9959905b6f507f527ce377d7c742a553d2cda8d3529c3915fb4a95ad45bf:    exists         |++++++++++++++++++++++++++++++++++++++| 
elapsed: 11.2s                                                                    total:  15.7 M (1.4 MiB/s)                                       
unpacking linux/amd64 sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6...
done: 709.697156ms

查看镜像

crt images <ls|list>

[root@host ~]# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE     PLATFORMS                                                                                LABELS 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -

镜像挂载

查看镜像的文件系统

crt images mount 镜像名称 本地目录

[root@host ~]# mkdir /mnt/nginx-alpine
[root@host ~]# ctr images mount docker.io/library/nginx:alpine /mnt/nginx-alpine/
sha256:a71c46316a83c0ac8c2122376a89b305936df99fa354c265f5ad2c1825e94167
/mnt/nginx-alpine/
[root@host ~]# cd /mnt/nginx-alpine/
[root@host nginx-alpine]# ls
bin  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

镜像卸载

卸载已经挂载到本地的镜像文件系统

crt images unmount 本地目录

[root@host ~]# ctr images unmount /mnt/nginx-alpine/
/mnt/nginx-alpine/
[root@host ~]# ls /mnt/nginx-alpine/

镜像导出

ctr images export --platform 平台 导出的文件名称 镜像名称

[root@host ~]# ctr images export --platform linux/amd64 nginx.tar docker.io/library/nginx:alpine
[root@host ~]# ls
anaconda-ks.cfg  containerd  nginx.tar

镜像删除

ctr images delete|del|remove|rm 镜像名称

[root@host ~]# ctr images del docker.io/library/nginx:alpine
docker.io/library/nginx:alpine
[root@host ~]# ctr images ls
REF TYPE DIGEST SIZE PLATFORMS LABELS

镜像导入

ctr images import 镜像文件名称

[root@host ~]# ctr images import  nginx.tar 
unpacking docker.io/library/nginx:alpine (sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6)...done
[root@host ~]# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE     PLATFORMS                                                                                LABELS 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -  

镜像名称

更改某个镜像的名称

ctr images tag 原镜像 新镜像名

[root@host ~]# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE     PLATFORMS                                                                                LABELS 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -      
[root@host ~]# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE     PLATFORMS                                                                                LABELS 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -      
[root@host ~]# ctr images tag docker.io/library/nginx:alpine nginx:alpine
nginx:alpine
[root@host ~]# ctr images ls
REF                            TYPE                                                      DIGEST                                                                  SIZE     PLATFORMS                                                                                LABELS 
docker.io/library/nginx:alpine application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -      
nginx:alpine                   application/vnd.docker.distribution.manifest.list.v2+json sha256:659610aadb34b7967dea7686926fdcf08d588a71c5121edb094ce0e4cdbc45e6 15.9 MiB linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/ppc64le,linux/s390x -  

容器管理

]]>
<![CDATA[Docker-容器管理]]> https://blog.boychai.xyz/index.php/archives/9/ 2022-04-06T06:32:00+00:00 2022-04-06T06:32:00+00:00 BoyChai https://blog.boychai.xyz Docker概述

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
下面的图片比较了容器技术和传统的虚拟化技术的对比,可见容器时在操作系统的基础上实现虚拟化,传统的虚拟化技术还需要一层guest OS系统做为基础实现。
传统虚拟化和容器技术

Docker的安装

官方文档:https://docs.docker.com/get-docker/
Docker的安装文档清晰明了可以直接去按照他给的步骤一步一步来。
卸载旧版本以及残留

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

设置docker的yum软件仓库

sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

安装

sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

设置docker开机自启并启动

sudo systemctl enable --now docker

运行一个docker的测试镜像来验证docker的安装

[root@docker ~]# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Docker的命令

镜像的管理

搜索/检索

docker search 镜像名称

[root@docker ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        16597     [OK]
bitnami/nginx                                     Bitnami nginx Docker Image                      121                  [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   39
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   17                   [OK]
rancher/nginx-ingress-controller                                                                  10
ibmcom/nginx-ingress-controller                   Docker Image for IBM Cloud Private-CE (Commu…   4
bitnami/nginx-ldap-auth-daemon                                                                    3
bitnami/nginx-exporter                                                                            2
circleci/nginx                                    This image is for internal use                  2

默认从dockerhub进行搜索镜像

下载/拉取

docker pull 名称:版本

[root@docker ~]# docker pull nginx:1.21.6
1.21.6: Pulling from library/nginx
c229119241af: Pull complete
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:1.21.6
docker.io/library/nginx:1.21.6

如果不加版本的话则拉取latest版本即最新版本

镜像列表

docker images
docker image ls

[root@docker ~]# docker images
REPOSITORY                                                        TAG       IMAGE ID       CREATED        SIZE
nginx                                                             1.21.6    12766a6745ee   10 days ago    142MB
rancher/mirrored-flannelcni-flannel                               v0.17.0   9247abf08677   5 weeks ago    59.8MB
rancher/mirrored-flannelcni-flannel-cni-plugin                    v1.0.1    ac40ce625740   2 months ago   8.1MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.23.0   e6bf5ddd4098   4 months ago   135MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.23.0   37c6aeb3663b   4 months ago   125MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.23.0   56c5af1d00b5   4 months ago   53.5MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.23.0   e03484a90585   4 months ago   112MB
registry.aliyuncs.com/google_containers/etcd                      3.5.1-0   25f8c7f3da61   5 months ago   293MB
registry.aliyuncs.com/google_containers/coredns                   v1.8.6    a4ca41631cc7   6 months ago   46.8MB
registry.aliyuncs.com/google_containers/pause                     3.6       6270bb605e12   7 months ago   683kB

五列数据分别代表镜像名称、镜像版本、镜像id、拉取时间、镜像大小

镜像标签

docker tag [imagesID] 改后名称:改后tag

[root@docker ~]# docker tag nginx:1.21.6 mynginx:1.21.6
[root@docker ~]# docker images |grep nginx
mynginx                                                           1.21.6    12766a6745ee   10 days ago    142MB
nginx                                                             1.21.6    12766a6745ee   10 days ago    142MB

镜像删除

docker rmi 镜像id

[root@docker ~]# docker rmi mynginx:1.21.6
Untagged: mynginx:1.21.6

镜像导出

docker save 镜像id/镜像名 > 名字.tar

[root@docker ~]# docker save nginx:1.21.6 > nginx-v1.21.6.tar
[root@docker ~]# ls
nginx-v1.21.6.tar

镜像导入

docker load < 包名

[root@docker ~]# docker rmi nginx:1.21.6
Untagged: nginx:1.21.6
Untagged: nginx@sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Deleted: sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619
Deleted: sha256:3ea962f6f388096ab9798790d363fc6f9c779c924a5eddf5c699d8da080114f7
Deleted: sha256:091a2aef7242e42505b69f1ad027d6a442cfce2403e260ac914f0fd6cc2d275f
Deleted: sha256:4e72a31f1cd6fd655cc0826c91e886967b6e965e13ac21f31f9f66c27a3b7732
Deleted: sha256:e3d1cdf9772a260b3e81a22c1940d63ac45dfe67720f78f00ca73834d9498934
Deleted: sha256:af40da71a8618ea9cbcdc333d5e60bd5b6df820f0d07a55f7c9a1c21fd930095
Deleted: sha256:608f3a074261105f129d707e4d9ad3d41b5baa94887f092b7c2857f7274a2fce
[root@docker ~]# docker load < nginx-v1.21.6.tar
608f3a074261: Loading layer [==================================================>]   83.9MB/83.9MB
ea207a4854e7: Loading layer [==================================================>]     62MB/62MB
33cf1b723f65: Loading layer [==================================================>]  3.072kB/3.072kB
5c77d760e1f4: Loading layer [==================================================>]  4.096kB/4.096kB
fac199a5a1a5: Loading layer [==================================================>]  3.584kB/3.584kB
ea4bc0cd4a93: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:1.21.6
[root@docker ~]# docker images |grep nginx
nginx                                                             1.21.6    12766a6745ee   10 days ago    142MB

容器的管理

创建容器

Docker run [options] image [command] [arg]
Option说明:
-d         后台运行
-i        以交互模式运行容器,通常与-t同时使用
-t         为容器重新分配一个伪输出终端,通常与-i同时使用
--name     设置容器名字
--net    指定网络连接类型
--h     设置主机名称
--dns    指定容器的dns服务器,默认和宿主一致
-e        设置环境变量(**=”**”)
-p         本地端口:容器端口     把容器的某个端口暴露到主机的某个端口
-v        本地目录:容器目录     把主机的某目录挂载到容器的目录里面实现文件系统的链接
--network   指定网络
--rm    容器关闭后自动删除

使用命令:"docker run -p 8080:80 -d --name nginx1 nginx"来运行一个nginx容器并且把容器的80端口暴露到本机的8080

[root@docker ~]# docker run -p 8080:80 -d --name nginx1 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
1fe172e4850f: Pull complete
35c195f487df: Pull complete
213b9b16f495: Pull complete
a8172d9e19b9: Pull complete
f5eee2cb2150: Pull complete
93e404ba8667: Pull complete
Digest: sha256:859ab6768a6f26a79bc42b231664111317d095a4f04e4b6fe79ce37b3d199097
Status: Downloaded newer image for nginx:latest
4cf61416ee672b595b99436d0fdcf8ebe5e6d22adaed8838b29e978f19372ecb

容器的创建过程是先到自己本地来找镜像,如果没有则去dockerhub镜像仓库拉取镜像之后再运行

容器列表

使用命令:"docker ps"来查看已经启动的容器,如果有停止运行的容器可以添加'-a'参数来查看

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
4cf61416ee67   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx1

关闭容器

使用命令:"docker stop {容器ID|容器名称}"来关闭容器

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS                     PORTS     NAMES
4cf61416ee67   nginx         "/docker-entrypoint.…"   6 minutes ago   Exited (0) 4 seconds ago             nginx1
58e6c5af6efe   hello-world   "/hello"                 12 hours ago    Exited (0) 12 hours ago              great_chatterjee

启动容器

使用命令:"docker start {容器ID|容器名称}"来开启容器

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                   NAMES
4cf61416ee67   nginx     "/docker-entrypoint.…"   7 minutes ago   Up 6 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx1

重启容器

使用命令:"docker restart {容器ID|容器名称}"来重启容器

进入容器

使用命令:"docker exec -it {容器ID|容器名称} /bin/sh"来进入容器,后面"/bin/sh"是指定进入容器时用的终端,如果容器内有其他的可以自行修改

[root@docker ~]# docker exec -it nginx1 /bin/sh
# exit
[root@docker ~]# docker exec -it nginx1 /bin/bash
root@4cf61416ee67:/# ls
bin  boot  dev  docker-entrypoint.d  docker-entrypoint.sh  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@4cf61416ee67:/# exit
exit

容器删除

使用命令:"docker rm {容器ID|容器名称}"来删除已经关闭的容器,如果容器在运行中想要强制删除可以加'-f'参数进行强制删除

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                                   NAMES
4cf61416ee67   nginx     "/docker-entrypoint.…"   15 minutes ago   Up 7 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   nginx1
[root@docker ~]# docker rm -f nginx1
nginx1
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

容器日志

使用命令:"docker logs {容器ID|容器名称}"来查看容器运行时的日志

[root@docker ~]# docker run -p 8081:80 -d --name myweb nginx
497eff031c03927f17fe14fcff49bea832403687d580294c42f9cfba697a1564
[root@docker ~]# docker logs myweb
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2022/05/02 05:30:57 [notice] 1#1: using the "epoll" event method
2022/05/02 05:30:57 [notice] 1#1: nginx/1.21.6
2022/05/02 05:30:57 [notice] 1#1: built by gcc 10.2.1 20210110 (Debian 10.2.1-6)
2022/05/02 05:30:57 [notice] 1#1: OS: Linux 4.18.0-348.el8.0.2.x86_64
2022/05/02 05:30:57 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2022/05/02 05:30:57 [notice] 1#1: start worker processes
2022/05/02 05:30:57 [notice] 1#1: start worker process 32
2022/05/02 05:30:57 [notice] 1#1: start worker process 33

容器转镜像

使用命令:"docker commit {容器ID|容器名称} 镜像名称"来打包容器,如果容器在运行中可以使用-p参数

[root@docker ~]# docker commit -p myweb myweb:v1.0
sha256:05f5efa5b56fd3d9c6d17b74ee4a3e9866095ac8cc681879dda21b9b7a968859
[root@docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
myweb         v1.0      05f5efa5b56f   4 seconds ago   142MB
nginx         latest    fa5269854a5e   11 days ago     142MB
hello-world   latest    feb5d9fea6a5   7 months ago    13.3kB

容器信息

使用命令"docker inspect {容器ID|容器名称}"来查看容器的详细信息
他会列出很多很多信息 我这里举例筛选出容器的IP看一下

[root@docker ~]# docker inspect myweb|grep IP
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
                    "IPAMConfig": null,
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,

DockerFile

概述

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

构建参数

COPY

复制指令,从上下文目录中复制到容器里面
用法:
COPY [--chown=用户:组] 源路径 容器目的路径
--chown可以不使用

ADD

ADD和COPY使用格式类似 同样需求下官方是推荐使用COPY

RUN

运行命令
用法:
RUN 命令

CMD

类似与Run 与RUN不同的是 CMD是在docker run 的时候执行 而RUN是在dockerfile构建镜像的时候执行
用法和RUN一样

ENTRYPOINT

类似CMD参数,但其不会被docker run的命令参数覆盖用法和RUN、CMD一样(当dockerfile存在多个此参数的时候只会执行最后一个)

ENV

改变环境变量,定义环境变量。
ENV key value

ARG

和ENV效果一样但是只会在dockerfile构建的时候生效 构建好容器之后不生效

VOLUME

定义默认挂载数据卷 当运行容器的时候如果没有定义位置会自动挂载
VOLUME 路径 路径

EXPOSE

声明端口 当使用-P运行容器的时候就是映射的这个端口
EXPOSE 端口

WORKDIR

指定工作目录 就是链接的时候的默认目录
WORKIDIR 目录

USER

用来指定执行后续命令的用户
USER 用户

构建

写好Dockerfile文件之后使用命令"docker build 镜像名称:版本 dockerfile的目录"来构建

[root@docker ~]# mkdir dockerfile
[root@docker ~]# cd dockerfile/    
[root@docker dockerfile]# vim dockerfile
[root@docker dockerfile]# cat dockerfile
FROM nginx
RUN echo '我是dockerfile构建的容器' > /usr/share/nginx/html/index.html
[root@docker dockerfile]# docker build -t mynginx:v1.0 ./
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> fa5269854a5e
Step 2/2 : RUN echo '我是dockerfile构建的容器' > /usr/share/nginx/html/index.html
 ---> Running in d73c0f94b402
Removing intermediate container d73c0f94b402
 ---> 4650cd039883
Successfully built 4650cd039883
Successfully tagged mynginx:v1.0
[root@docker dockerfile]# docker images |grep mynginx
mynginx       v1.0      4650cd039883   10 seconds ago   142MB

Docker的网络

概述

Docker网络是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络无法直接访问到容器,从而实现网络的隔离。

网络模式

Host

host
启动容器时使用host模式,那这个容器将不会获得一个独立的ip,而是和宿主机共用一个ip,容器将不会虚拟出自己的网卡,而是使用宿主机的ip和端口,但是容器其他方面,比如文件系统,进程系统都是独立。

Container

container
启动容器时使用Container使用的时候需要指定一个容器id或者容器名称,这个模式会和指定的容器共享同一个ip,和host一样除了ip是共享对应容器的ip之外,容器的其他方面,比如文件系统,进程系统都是独立的。

None

none
启动容器时使用None,Docker容器将不会生成网卡,也就是说容器会没有网卡,ip,路由等信息。需要我们自己来添加。这种网络情况只会又一个lo回环网卡。

bridge

bridge
当docker服务启动的时候,会在主机上创建一个docker0的虚拟网卡,此主机默认启动的容器都会链接到这个虚拟网卡上。类似与vmwar 的一个虚拟网络。

网络管理

网络列表

使用命令:"docker network ls"来列出所有当前网络

[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ac3a791d7c38   bridge    bridge    local
cb275e88b131   host      host      local
68b3fda03c16   none      null      local

创建网络

docker network create 参数 网络名称
-d:网路模式
--subnet:指定网段
--gateway:指定网关(指定虚拟网卡得ip)
自定网络可以支持很多东西 比如不需要dns可以通过容器名来互相ping同
比如我用network create了一个网络 并且创建了两个容器 os1,os2 使用os1pingos2的时候会互通 不需要配置任何的dns 他会自动寻找 默认的docker0则就没有这个功能

[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork
5fb087dccbabedf4b97fcc09b448ee717acbfa35fc520698985f536dea8be5e7
[root@docker ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
ac3a791d7c38   bridge      bridge    local
cb275e88b131   host        host      local
5fb087dccbab   mynetwork   bridge    local
68b3fda03c16   none        null      local

删除网络

使用命令:"docker rm {网络ID|网络名称}"
[root@docker ~]# docker network ls
NETWORK ID     NAME        DRIVER    SCOPE
ac3a791d7c38   bridge      bridge    local
cb275e88b131   host        host      local
5fb087dccbab   mynetwork   bridge    local
68b3fda03c16   none        null      local
[root@docker ~]# docker network rm mynetwork
mynetwork
[root@docker ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
ac3a791d7c38   bridge    bridge    local
cb275e88b131   host      host      local
68b3fda03c16   none      null      local

关联容器

docker network connect 命令是用于将docker容器 连接/断开 到某个网络中,或者与其他容器 建联/断开,容器可以使用容器名或者容器ID。
用法:
docker network connect/disconnect {网络ID|网络名称} {容器ID|容器名称}

详细信息

使用命令:"docker network inspect {网络ID|网络名称}"来查询网络的详细信息

[root@docker ~]# docker network create -d bridge --subnet 192.168.1.0/24 --gateway 192.168.1.254 mynetwork
af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e
[root@docker ~]# docker network inspect mynetwork
[
    {
        "Name": "mynetwork",
        "Id": "af5233ce4e299130cadee1bc8c9754b576bfb63d6ac229ad7856a653b2109e1e",
        "Created": "2022-05-02T02:44:46.644429172-04:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

Docker-Compose容器编排

概述

Docker Compose可以轻松,高效的管理容器,他是一个用于定义和运行多个容器的docker的应用程序工具。在生产环境中一个应用肯定有很多个docker容器构成,而就单纯的docker一次性只能实现单个容器的部署,为了这个问题,docker compose 应运而生。

安装

官方下载文档:https://docs.docker.com/compose/install/
docker默认不自带docker-compose工具,需要自己手动去下载

[root@docker ~]# curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   664  100   664    0     0   1412      0 --:--:-- --:--:-- --:--:--  1412
100 25.2M  100 25.2M    0     0   239k      0  0:01:48  0:01:48 --:--:--  365k
[root@docker ~]# chmod +x /usr/bin/docker-compose
[root@docker ~]# docker-compose -v
Docker Compose version v2.4.1

使用和管理

使用

使用docker-compose需要在目录里定义一个名称为"docker-compose.yml"的yml文件,这个文件就是用来定义服务配置的之后可以使用docker-compose来管理这个文件里定义的资源。
官方文档:Docker-Compose

启动

docker-compose up

在当前目录定义好docker-compose的yml文件之后可以使用此命令来运行,默认在前台运行可以追加"-d"参数使其运行在和后台。

重新运行

docker-compose restart

重启全部定义的容器资源

停止运行

docker-compose stop

停止运行定义的容器

删除

docker-compose down

停止并删除对应的容器

YML配置参考

docker-compose.yml的格式

#全局配置层
version: "3"      #版本
services:
  ##定义层 
  app1:
    ##配置层
    image: nginx:1.26    #镜像
    ports:80:80         #端口映射 
    environment: aa=bb  #系统环境
    volumes:             #挂载卷定义
    networks:           #网络定义
  app2:
  app3:
  ...

version

这个版本需要和docker的版本相对应具体对应信息可去官网查看版本对照

build

在配置层定义,如果自己定义了dockerfile想让docker-compose来运行可以直接使用build来构建。

version: "3"
services:
  myapp:
    build: .

image

在配置层定义,用来指定镜像
version: "3"

services:
  myapp:
    image: nginx

command

在配置层定义,修改容器启动时执行的命令

version: "3"
services:
  myapp:
    image: centos
    command: ["bash"]

container_name

在配置层定义,默认docker-compose启动容器的名称格式为<项目名称>_<服务名称>_<序号>,这个参数可以直接修改容器的名字

version: "3"
services:
  myapp:
    container_name: myapp
    image: centos
    command: ["bash"]

environment

在配置层定义,定义容器的环境变量

version: "3"
services:
  myapp:
    container_name: mySQL
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: aaaaaa

env_file

在配置层定义,和environment一样用来定义环境变量,他这个是指定一个文件,直接使用environment来定义环境变量可能会有一些敏感信息不适合直接放在docker-compose里使用,env_file可以指定一个环境文件,文件格式为键值对的方式key=value

version: "3"
services:
  myapp:
    container_name: mySQL
    image: mariadb
    env_file:
      - ./env
[root@boychai docker-compose]# cat env
MYSQL_ROOT_PASSWORD=aaaaaaa

depends_on

在配置层定义,用来配置启动关系,配置了之后里面写其他服务容器的名称,只有里面定义容器启动后,自己才会启动,可以理解为服务容器启动的前提条件。

version: "3"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: mysql

restart

在配置层定义,用来配置重启策略,模式如下
no:是默认的重启策略,在任何情况下都不会重启容器
always:容器总是重新启动
on-failure:在容器非正常退出时(退出状态非0),才会重启容器
unless-stopped:在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

version: "3"
services:
  web:
    restart: always
    build: .
    depends_on:
      - db
      - redis
  redis:
    restart: always
    image: redis
  db:
    restart: always
    image: mysql

volumes

在配置层定义,用来把主机的数据卷或着文件挂载到容器里。如下

version: "3"
services:
  myapp:
    image: nginx:latest
    volumes:
      - "/usr/nginx/html:/usr/share/nginx/html"
      - "/var/log/nginx:/var/log/nginx"

也可以在全局层进行一个生命,然后配置层进行调用,如下

version: "3"
services:
  myapp:
    image: nginx:latest
    volumes:
      - nginx_html:/usr/share/nginx/html
      - nginx_log:/var/log/nginx
volumes:
  - nginx_html: /usr/nginx/html
  - nginx_log:/var/log/nginx

networks

网络配置,默认不声明的话docker会自动生成一个默认的bridge类型的网络,在全局配置层定义一个networks,如下配置

version: "3"
services:
  myapp:
    image: nginx:latest
networks:
  default:
    driver: bridge

定义默认网络模式为bridge,如果容器不指定则全部使用或者bridge
我们还可以自定义一个网络名字,之后在容器的配置层进行绑定这个名词

version: "3"
services:
  myapp:
    image: nginx:latest
    networks:
      - mynetwork
networks:
  mynetwork:
    driver: bridge

也可以绑定已存在的网络

version: "3"
services:
  myapp:
    image: nginx:latest
    networks:
      - mynetwork
networks:
  mynetwork:
    external:
    name: network-test

其他

关于docker-compose的配置有很多,我这里只是介绍了部分常用的配置,更多具体的配置可以去官网进行查看更多配置

实例

这里使用docker-compose的方式部署一个WordPress的博客,提供配置参考学习使用。
官方教程

[root@boychai wp]# cat > docker-compose.yml <<EOF
version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

volumes:
  wordpress:
  db:
EOF
[root@boychai wp]# docker-compose up -d
Creating network "wp_default" with the default driver
Creating volume "wp_wordpress" with default driver
Creating volume "wp_db" with default driver
Pulling wordpress (wordpress:)...
latest: Pulling from library/wordpress
a2abf6c4d29d: Already exists
c5608244554d: Already exists
2d07066487a0: Already exists
1b6dfaf1958c: Already exists
32c5e6a60073: Already exists
90cf855b27cc: Already exists
8b0f1068c586: Already exists
5355461305e8: Already exists
ad1eec592342: Already exists
e03fbc76cb78: Already exists
1f5796e48b39: Already exists
72fbe8e1d4e7: Already exists
96edece66175: Already exists
5f46f0743de2: Pull complete
c9f9671a5e1f: Pull complete
3f543dcd35b1: Pull complete
c88e21a0c2a0: Pull complete
964b4457a910: Pull complete
0d55fb9a64ef: Pull complete
fb009ff7c567: Pull complete
4f058a67a50d: Pull complete
Digest: sha256:fc33b796b04162a0db2e9ea9b4c361a07058b21597b1317ad9ab3ea4593de241
Status: Downloaded newer image for wordpress:latest
Creating wp_db_1        ... done
Creating wp_wordpress_1 ... done
[root@boychai wp]#

访问服务器地址加8080端口即可出现博客初始化页面,如下图
效果

]]>