BoyChai's Blog - Docker https://blog.boychai.xyz/index.php/tag/Docker/ zh-CN Wed, 30 Aug 2023 07:25:40 +0000 Wed, 30 Aug 2023 07:25:40 +0000 [资源]容器镜像代理站、加速站收集 https://blog.boychai.xyz/index.php/archives/63/ https://blog.boychai.xyz/index.php/archives/63/ Wed, 30 Aug 2023 07:25:40 +0000 BoyChai 0 https://blog.boychai.xyz/index.php/archives/63/#comments https://blog.boychai.xyz/index.php/feed/tag/Docker/ Harbor-容器镜像仓库(部署和简单使用) https://blog.boychai.xyz/index.php/archives/41/ https://blog.boychai.xyz/index.php/archives/41/ Sat, 08 Oct 2022 05:31:47 +0000 BoyChai Harbor概述

Harbor是由VMware公司开源的容器镜像仓库。事实上,Harbor是在docker registry上进行企业级扩展,从而获得了更加广泛的应用。

官网:https://goharbor.io/

GitHub:https://github.com/goharbor/harbor

部署先决条件

服务器硬件配置

  • 最低要求:CPU2核、内存4G、硬盘40GB
  • 推荐:CPU4核、内存8G、硬盘160GB

软件

  • Docker CE 17.06版本+
  • Docker Compose 1.18版本+

Harbor安装方式

  • 在线安装:从Docker Hub下载Harbor相关镜像。
  • 离线安装:安装包包含部署的相关镜像,安装包很大。

Harbor部署

  • docker version:Docker version 20.10.18, build b40c2f6
  • docker-compose version: Docker Compose version v2.11.2
  • harbor version: v2.6.0

本文采用离线安装的方式,harbor的下载地址:https://github.com/goharbor/harbor/releases

下载好并上传至服务器中,安装具体流程如下

[root@harbor ~]# tar xvf harbor-offline-installer-v2.6.0.tgz
harbor/harbor.v2.6.0.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl
[root@harbor ~]# cd harbor
[root@harbor harbor]# cp harbor.yml.tmpl harbor.yml
# 修改hostname字段(域名),注释https相关配置,修改harbor_admin_password字段(初始密码)
[root@harbor harbor]# vim harbor.yml
hostname: harbor.host.com
harbor_admin_password: Harbor12345
# 初始化环境(导入镜像)
[root@harbor harbor]# ./prepare
# 安装
[root@harbor harbor]# ./install.sh

访问服务器80端口即可,默认用户为admin,密码为harbor.yml里面的harbor_admin_password设定的值

Harbor基本使用

添加信任仓库

如果harbor搭建禁用掉了https,那么就要做一下操作:

编辑/etc/docker/daemon.json,添加以下配置

{

"insecure-registries": ["192.16.1.3"],

}

后面是服务器的ip或者域名,保存重启,使用下面命令检查

[root@harbor harbor]# docker info |grep -A1 Insecure
 Insecure Registries:
  192.16.1.3

注意:基本使用实在客户端用的,如果在服务端使用并且重启docker之后harbor的网页掉了则需要再次进入harbor目录使用docker-compose启动harbor

上传镜像

在上传镜像之前需要有上传镜像的权限,我们直接使用admin来上传镜像,使用下面命令来登录harbor

[root@harbor harbor]# docker login 192.16.1.3
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

上传镜像到对应仓库的时候需要修改tag,tag格式为“仓库域名或ip/镜像位置/镜像名称:版本号”

例如hello-world这个镜像,上传到刚才搭建的镜像仓库方法如下

[root@harbor harbor]# docker tag hello-world:latest 192.16.1.3/library/my-hello-world:v1.0
[root@harbor harbor]# docker push 192.16.1.3/library/my-hello-world:v1.0
The push refers to repository [192.16.1.3/library/my-hello-world]
e07ee1baac5f: Pushed
v1.0: digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4 size: 525

下载镜像

下载镜像时只需要在pull的时候输好镜像全称即可,例如

[root@harbor harbor]# docker pull 192.16.1.3/library/my-hello-world:v1.0
v1.0: Pulling from library/my-hello-world
Digest: sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4
Status: Downloaded newer image for 192.16.1.3/library/my-hello-world:v1.0
192.16.1.3/library/my-hello-world:v1.0
]]>
0 https://blog.boychai.xyz/index.php/archives/41/#comments https://blog.boychai.xyz/index.php/feed/tag/Docker/
Jenkins-持续性集成平台(部署安装) https://blog.boychai.xyz/index.php/archives/13/ https://blog.boychai.xyz/index.php/archives/13/ Tue, 31 May 2022 04:28:00 +0000 BoyChai 官方文档

官方文档

YUM的方式

系统环境

Rocky Linux 8.5,2G内存2核CPU,selinux和防火墙全部关闭

安装

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install fontconfig java-11-openjdk
yum install jenkins
systemctl start jenkins

启动后直接访问主机的8080端口即可

Docker的方式

系统环境

Rocky Linux 8.5,2G内存2核CPU,selinux和防火墙全部关闭

docker版本: 20.10.16

安装

useradd -s /sbin/nologin jenkins
mkdir /srv/jenkins
chown -R jenkins:jenkins /srv/jenkins
docker run -d --name jenkins -p 8080:8080 -p 50000:50000 --restart=on-failure -v /srv/jenkins:/var/jenkins_home -u root jenkins/jenkins:lts-jdk11

50000端口是一个代理端口,/srv/Jenkins是本地的目录需要自己创建,也可以自己改。

初始化

访问8080端口之后需要进入初始化阶段,访问之后如下图

初始化

如果在本地直接部署的话可以直接cat这个文件“cat /var/lib/jenkins/secrets/initialAdminPassword”,如果是在docker中部署的可以使用docker logs jenkins来查,或者"
cat /srv/jenkins/secrets/initialAdminPassword"来查看

插件安装

这个安装插件会从jenkins官网来下载插件,会很慢不建议初始化的时候安装任何的插件,这里点击选择插件来安装,之后需点击"无"之后在进行安装

选择插件

这个时候会让你创建一个管理员用户,这个用户无所谓根据自己来创建即可

创建用户

之后还会让你去配置一个url地址这个直接默认保存即可有域名可以配域名。

url配置

之后就安装完成了

开始使用

安装完成

]]>
0 https://blog.boychai.xyz/index.php/archives/13/#comments https://blog.boychai.xyz/index.php/feed/tag/Docker/
GitLab-代码仓库(部署安装) https://blog.boychai.xyz/index.php/archives/12/ https://blog.boychai.xyz/index.php/archives/12/ Sat, 28 May 2022 11:23:00 +0000 BoyChai 官方文档

官方文档

系统直接安装的方式

系统环境

CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭

官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来

安装

sudo yum install -y curl policycoreutils-python openssh-server perl   //安装前置依赖软件
sudo systemctl enable sshd  //设置开机自启 
sudo systemctl start sshd   //开启服务
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash  //配置yum源
sudo EXTERNAL_URL="http://gitlab.host.com" yum install -y gitlab-jh  //设置访问地址之后安装GitLab

安装好之后会出先一些备注信息,如下图

gitlab_01

使用Docker的方式

系统环境

CentOS7,4核CPU和4G内存,selinux和防火墙全部关闭

官方推荐最小配置为4核CPU和4G内存,GitLab很吃内存,太低可能部署不起来

docker版本为 20.10.16

docker-compose版本为 v2.5.0

安装

系统变量配置

在安装之前需要配置一个系统环境,用来存储GitLab安装时、运行时,产生的配置、日志文件。

export GITLAB_HOME=/srv/gitlab
本地位置容器位置存储内容
$GITLAB_HOME/data/var/opt/gitlab用于存储应用程序数据。
$GITLAB_HOME/logs/var/log/gitlab用于存储日志。
$GITLAB_HOME/config/etc/gitlab用于存储极狐GitLab 配置文件。

使用docker安装

sudo docker run --detach \
  --hostname gitlab.host.com \
  --publish 443:443 --publish 80:80 --publish 23:22 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest

其中--hostname需要替换成自己的域名。之后使用docker的方式安装下载好镜像启动之后容器会进行初始化,期间是访问不了的可以使用命令“sudo docker logs -f gitlab”来查看进度

使用docker-compose安装

docker-cmpose的yml文件内容为

version: '3.6'
services:
  web:
    image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
    restart: always
    hostname: 'gitlab.host.com'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'
        # Add any other gitlab.rb configuration here, each on its own line
    ports:
      - '80:80'
      - '443:443'
      - '23:22'
    volumes:
      - '$GITLAB_HOME/config:/etc/gitlab'
      - '$GITLAB_HOME/logs:/var/log/gitlab'
      - '$GITLAB_HOME/data:/var/opt/gitlab'
    shm_size: '256m'

启动命令: "docker-compose up -d"
其中hostname需要替换成自己的域名,之后使用docker安装的话下载好镜像启动之后容器会进行初始化,期间是访问不了的,如果想要查看进度需要查看docker-compose运行容器的名称之后使用
命令”docker logs -f [容器名称]“来看。

安装完成

此时访问配置好的域名即可访问,默认账号为root,密码存放在系统或者容器的/etc/gitlab/initial_root_password文件中,cat一下直接使用即可

gitlab_02

ps:容器密码文件存放在/srv/gitlab/config/initial_root_password文件中,全部的密码文件只会存在24小时,使用这个密码登录只后建议创建一个新的密码

]]>
0 https://blog.boychai.xyz/index.php/archives/12/#comments https://blog.boychai.xyz/index.php/feed/tag/Docker/
Docker-容器管理 https://blog.boychai.xyz/index.php/archives/9/ https://blog.boychai.xyz/index.php/archives/9/ Wed, 06 Apr 2022 06:32:00 +0000 BoyChai 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端口即可出现博客初始化页面,如下图
效果

]]>
0 https://blog.boychai.xyz/index.php/archives/9/#comments https://blog.boychai.xyz/index.php/feed/tag/Docker/