2020-03-23

N_Docker Compose N_Kubernetes

Docker

docker是一个开源项目,诞生于2013 年初,最初是dotCloud 公司内部的一个业余项目。它基于Google 公司推出的Go 语言实现。

2013年3月,dotCloud公司的创始人之一,docker之父,28岁的Solomon Hykes正式决定,将docker项目开源。遵从了Apache 2.0 协议,项目代码在GitHub上进行维护。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

get-started 官方-命令参考 阿里镜像-下载地址

基本概念

docker 镜像(Image)

docker镜像类似于虚拟机镜像,可以将其理解为一个只读模板。除了提供容器运行时所需的程序、库、资源、配置等文件外,docker镜像还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

docker 容器(container)

what-is-a-container?

容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除,但是所有的容器是相互隔离的,互不可见的,这就提供了一个实体机可以安装多个容器,且很轻量级相对于虚拟机。镜像本身是只读的,容器从镜像启动的时候,docker会在镜像的最上层创建一个可写层,镜像本身保持不变。

Docker Compose

Docker Compose 是一个用于定义和运行多容器应用程序的工具。它使用一个 YAML 文件来配置应用程序的服务和网络连接,使得多个容器可以协同工作。

安装

安装 for ubuntu

安装 docker

Install Docker Engine on Ubuntu

You can install Docker Engine in different ways, depending on your needs:

  1. Most users set up Docker’s repositories and install from them, for ease of installation and upgrade tasks. This is the recommended approach.

  2. Some users download the DEB package and install it manually and manage upgrades completely manually. This is useful in situations such as installing Docker on air-gapped systems with no access to the internet.

  3. In testing and development environments, some users choose to use automated convenience scripts to install Docker.

Uninstall old versions sudo apt-get remove docker docker-engine docker.io containerd runc

Install using the apt repository

  1. Set up Docker’s apt repository.
 
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
 
 
 
# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

仓库源公钥如还有问题, 执行: sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 7EA0A9C3F273FCD8

  1. Install the Docker packages.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Verify that the Docker Engine installation is successful by running the hello-world image.

$ sudo docker run hello-world

安装 docker-compose

# 下载
sudo curl -L https://github.com/docker/compose/releases/download/2.17.0/docker-compose-$(uname -s)-$(uname -m) -o ./docker-compose-linux-x86_64
 
# 或 手动下载 https://github.com/docker/compose/releases
 
# 移动到bin目录下
sudo mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# 增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
 
# 查看docker-compose版本号
sudo docker-compose -v

错误启动失败

Failed to start Docker Application Container Engine.

journalctl -xe 查看

Mar 29 23:36:41 ubuntu systemd[1]: docker.socket: Failed with result ‘service-start-limit-hit’.

解决方案: 镜像文件为 /etc/docker/daemon.json, 则修改daemon.json文件后缀为daemon.conf即可正常启动docker sudo mv /etc/docker/daemon.json /etc/docker/daemon.conf (https://www.jianshu.com/p/dc32695046bd)

安装 for centos7

官方文档

 
//添加yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
 
//安装 ce(社区版)
yum install docker-ce

安装 docker-compose

yum install -y epel-release
yum install -y python-pip
pip install docker-compose

错误 : error code 1 in /tmp/pip-build-vUZ7PS/subprocess32/

  • 升级pip pip install --upgrade pip

错误 : Running setup.py install for subprocess32 … error

  • pip install matplotlib -i https://pypi.douban.com/simple

错误 : ERROR: Cannot uninstall ‘subprocess32’.

  • 搜索subprocess32-3.2.6-py2.7.egg-info文件 sudo find / -name *subpro*.egg-info
  • 删除 rm -rf /usr/lib64/python2.7/site-packages/subprocess32-3.2.6-py2.7.egg-info

错误 : ERROR: Command errored out with exit status 1:

  • 安装GCC

yum install -y gcc

finally !! docker-compose -v

运行/停止 docker服务

service docker start  
 
service docker restart  
 
service docker stop  
 

安装 for windows 10

参考官方文档

Docker 有专门的 Win10 专业版系统的安装包

配置服务

https://docs.docker.com/config/daemon/start/

Start with systemd On some operating systems, like Ubuntu and Debian, the Docker daemon service starts automatically. Use the following command to start it manually:

 
sudo systemctl start docker
 
sudo systemctl restart docker
 
sudo systemctl status docker
 
sudo systemctl stop docker
 

参考

sudo vi /etc/docker/daemon.json

关于daemon.json 配置文件可以参考

容器

https://docs.docker.com/engine/reference/run/

创建容器 (Create Container)

docker create

用于创建一个新的 Docker 容器,但不会立即启动它。

  • docker create <选项> <镜像名称>:<标签>: 创建一个新容器,但不会立即启动它。可以使用 docker start 启动它。

—name:指定容器的名称。 -a, —attach=[]:将容器的标准输入(stdin)、标准输出(stdout)和标准错误(stderr)连接到当前终端。 —detach-keys:覆盖分离容器的键序列(默认为 ctrl-p,ctrl-q)。 —entrypoint:覆盖容器的入口点,允许您指定在容器启动时执行的命令。 -e, —env=[]:设置环境变量,可以多次使用以设置多个环境变量。 —expose=[]:指定要暴露的端口号,这些端口可以用于容器间的通信。

  • 示例:docker create --expose=80 --expose=443 --name web-container my-web-image —hostname:设置容器的主机名。
  • 示例:docker create --hostname=my-host --name my-container ubuntu:latest -i, —interactive:允许容器的标准输入保持打开,以便您可以与容器交互。
  • 示例:docker create -i --name my-container ubuntu:latest —label=[]:为容器添加标签,用于标识和组织容器。
  • 示例:docker create --label environment=production --label app=my-app --name my-container ubuntu:latest -v, —volume=[]:将本地目录挂载到容器内,以便容器可以访问本地文件或数据。
  • 示例:docker create -v /path/on/host:/path/in/container --name data-container my-data-image

docker run

用于创建一个新的 Docker 容器,并立即启动它。 docker run

//绑定端口 & 目录

docker run -p 9292:9292 --name PaddleServing_0 -v /home/jk/PaddleServing/Serving:/var/PaddleServing -dit registry.baidubce.com/paddlepaddle/serving:0.8.0-devel /bin/bash

启动容器 (Start Container)

https://docs.docker.com/reference/cli/docker/container/start/

  • docker start <容器ID或名称>: 启动一个已创建的容器。
docker start c521c24aedb6
 
docker restart <容器ID>
docker stop <容器ID>
 
docker  stop $(sudo docker ps -a -q) // 停止所有容器

停止容器 (Stop Container)

  • docker stop <容器ID或名称>: 停止正在运行的容器。

重启容器 (Restart Container)

  • docker restart <容器ID或名称>: 重新启动一个已停止的容器。
docker rm -f 1e560fca3906
# 删除所有容器
docker  rm $(sudo docker ps -a -q) 
 
# 按条件筛选之后删除容器
docker rm `docker ps -a | grep xxxxx | awk '{print $1}'`

删除容器 (Remove Container)

  • docker rm <容器ID或名称>: 删除一个已停止的容器。如果容器正在运行,可以使用 -f 选项来强制删除。

查看容器列表 (List Containers)

  • docker ps: 列出正在运行的容器。使用 -a 选项可查看所有容器,包括已停止的。

查看容器详细信息 (Inspect Container)

  • docker inspect <容器ID或名称>: 显示有关特定容器的详细信息,包括配置、状态、网络设置等。

进入容器 (Attach to Container)

docker exec

https://docs.docker.com/engine/reference/commandline/exec/

  • docker exec -it <容器ID或名称> <命令>: 进入正在运行的容器,以执行特定的命令。 -it 选项允许与容器的标准输入和输出交互。 docker在1.3.X 版本之后还提供了一个新的命令exec用于进入容器, 这种方式相对更简单一些 (推荐)退出容器终端, 不会导致容器的停止;

进入后附加环境

docker exec -it f36a7e6f3482 bash
docker exec -it 2a2578049aec /bin/bash
docker exec -it 2a2578049aec sh
docker exec -it 2a2578049aec /bin/s
docker exec 

docker attach

docker run -it ubuntu /bin/bash //参数 itd: 是放在后台运行; it: 是直接使用 docker ps 查看到该容器信息 sudo docker attach 44fc0f0582d9 进入

使用该命令注意:

  • 当多个窗口同时使用该命令进入该容器时, 所有的窗口都会同步显示; 如果有一个窗口阻塞了, 那么其他窗口也无法再进行操作;
  • 一旦退出终端, 容器自动关闭

查看容器日志 (View Container Logs)

https://docs.docker.com/engine/reference/commandline/logs/

  • docker logs <容器ID或名称>: 查看容器的日志输出。 -f : 查看实时日志 -t : 查看日志产生的日期  
  • 查看容器日志
docker logs 40d4f412c70c
docker logs bcfb5383a033
  • 查看容器全部信息 docker inspect 40d4f412c70c

  • 容器日志文件 /var/lib/docker/containers/40d4f412c70c7d6ff47ca6ec986174f56d304b9bbc48bd8a9ca9ce56bb00803f 以 json.log结尾的文件

复制容器文件

# 使用docker cp命令将容器内的文件复制到本地:
docker cp my-nginx:/etc/nginx/nginx.conf ./nginx.conf
 
# 使用docker cp命令将本地的文件复制到容器内:
docker cp ./nginx.conf my-nginx:/etc/nginx/nginx.conf
 

查看容器资源使用情况 (Stats)

  • docker stats <容器ID或名称>: 实时查看容器的资源使用情况,如 CPU、内存、网络和磁盘。

资源绑定

端口映射

https://docs.docker.com/network/ 通过 docker ps 命令可以查看到容器的端口映射, docker 还提供了另一个快捷方式, 使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号;

docker run --name container-name:tag -d -p 宿主机端口:容器内部端口 image-name

例应用容器 ID 为 bf08b7f2cd89 名字为 wizardly_chandrasekhar; 我可以使用 docker port bf08b7f2cd89docker port wizardly_chandrasekhar 来查看容器端口的映射情况;

目录绑定 —volume

参考 run命令 https://docs.docker.com/storage/volumes/ --volume , -v Bind mount a volume

 docker run -v /doesnt/exist:/foo -w /foo -i -t ubuntu bash

When the host directory of a bind-mounted volume doesn’t exist, Docker automatically creates this directory on the host for you. In the example above, Docker creates the /doesnt/exist folder before starting your container.

镜像

镜像源

Configure the Docker daemon

科大镜像:https://docker.mirrors.ustc.edu.cn

for linux

  • 可以在 Docker 守护进程启动时传入 —registry-mirror 参数: docker --registry-mirror=https://hub-mirror.c.163.com/ daemon

  • 可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值; docker -h —config 后面看到默认的路径

sudo vi /etc/docker/daemon.json

{ "registry-mirrors": ["https://s0nx2ho6.mirror.aliyuncs.com"] }

测试镜像源是否有效

 sudo docker pull dockerproxy.com/library/nginx:latest
 sudo docker pull hub-mirror.c.163.com/library/nginx:latest
 sudo docker pull mirror.baidubce.com/library/nginx:latest
 sudo docker pull ccr.ccs.tencentyun.com/library/nginx:latest

修改保存后重启 Docker 以使配置生效; service docker restart

执行 docker info,如果从结果中看到了如下内容,说明配置成功

 
Registry Mirrors:
 https://hub-mirror.c.163.com/
 

for windown

  1. Settings Docker Engine
  2. 配置”registry-mirrors”
  3. Apply & Restart

代理 proxies

for pulling and pushing images

https://docs.docker.com/reference/cli/dockerd/#proxy-configuration

If you are behind an HTTP proxy server, for example in corporate settings, you may have to configure the Docker daemon to use the proxy server for operations such as pulling and pushing images. The daemon can be configured in three ways:

  1. Using environment variables (HTTP_PROXYHTTPS_PROXY, and NO_PROXY).
  2. Using the http-proxyhttps-proxy, and no-proxy fields in the daemon configuration file (Docker Engine version 23.0 or later).
  3. Using the --http-proxy--https-proxy, and --no-proxy command-line options. (Docker Engine version 23.0 or later).

第一种

https://docs.docker.com/engine/daemon/proxy/

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

添加以下内容:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:3223"
Environment="HTTPS_PROXY=http://127.0.0.1:3223"

` 第二种

https://docs.docker.com/engine/daemon/proxy/ You can find this file at $HOME/.docker/daemon.json. To change the configuration, either edit the JSON configuration directly from the dashboard in Docker Desktop, or open and edit the file using your favorite text editor.

You may configure proxy behavior for the daemon in the daemon.json file, or using CLI flags for the --http-proxy or --https-proxy flags for the dockerd command. Configuration using daemon.json is recommended.

vim /etc/docker/daemon.json 已测试

{
  "proxies": {
    "http-proxy": "http://127.0.0.1:3223",
    "https-proxy": "http://127.0.0.1:3223",
    "noProxy": "192.168.0.0/16,10.0.0.0/8"
  }
}
 

Flush changes and restart Docker

sudo systemctl daemon-reload
sudo systemctl restart docker

检查

docker info

构建镜像 (Build Image)

  • docker build -t <镜像名称>:<标签> <Dockerfile路径>: 从 Dockerfile 构建一个镜像,-t 用于指定镜像名称和标签。

推送镜像 (Push Image)

 - docker push <镜像名称>:<标签>: 将本地 Docker 镜像推送到镜像仓库,如 Docker Hub。

搜索镜像 (Search Images)

  • docker search <关键词>: 在 Docker Hub 等镜像仓库中搜索 Docker 镜像。

查看本地镜像 (List Local Images)

  • docker images: 列出本地所有的 Docker 镜像,包括名称、标签、镜像 ID、大小等信息。

拉取镜像 (Pull Image)

  • docker pull <镜像名称>:<标签>: 从镜像仓库中拉取指定的 Docker 镜像到本地。

删除镜像 (Remove Image)

  • docker rmi <镜像ID或名称>: 删除本地的一个或多个 Docker 镜像。 docker rmi hello-world

按条件筛选之后删除

docker rmi `docker images | grep xxx | awk '{print $3}'`
 
# 例
## 先看下输出
docker images | grep dev-peer0 | awk '{print $3}'
 
## 删除
docker rmi `docker images | grep hyperledger | awk '{print $3}'`
## 删不了,带-f 强制删除
docker rmi -f `docker images | grep hyperledger | awk '{print $3}'`

docker rmi 镜像名:TAG(也叫版本号或标签) docker rmi -f hyperledger/fabric-tools:2.0.0

删除未使用的镜像

  • docker image prune: 删除未被任何容器引用的未标记镜像。可以使用 docker image prune -a 删除所有未使用的镜像。

显示镜像详细信息 (Inspect Image)

  • docker image inspect <镜像ID或名称>: 显示有关特定 Docker 镜像的详细信息,包括配置、标签、层信息等。

导出镜像 (Export Image)

  • docker save -o <输出文件名.tar> <镜像名称>:<标签>: 将 Docker 镜像导出为一个 tar 归档文件。

示例 docker save -o nginx.tar nginx:latestdocker save > nginx.tar nginx:latest

其中-o和>表示输出到文件, nginx.tar为目标文件, nginx:latest是源镜像名(name:tag)

tools 其实是 cli

docker save -o dk_fabric-peer.tar.gz hyperledger/fabric-peer:2.0.0 docker save -o dk_fabric-orderer.tar.gz hyperledger/fabric-orderer:2.0.0 docker save -o dk_fabric-nodeenv.tar.gz hyperledger/fabric-nodeenv:2.0.0 docker save -o dk_fabric-javaenv.tar.gz hyperledger/fabric-javaenv:2.0.0 docker save -o dk_fabric-tools.tar.gz hyperledger/fabric-tools:2.0.0

docker save -o dk_fabric-kafka.tar.gz hyperledger/fabric-kafka:latest docker save -o dk_fabric-zookeeper.tar.gz hyperledger/fabric-zookeeper:latest

导入镜像 (Import Image)

  • docker load -i <输入文件名.tar>: 从一个 tar 归档文件中导入 Docker 镜像。

docker load --input ./nginx.tar docker load —input dk_fabric-peer.tar.gz docker load —input dk_fabric-javaenv.tar.gz

常用镜像

centos 镜像

  • 拉取指定版本的 CentOS 镜像, 这里我们安装指定版本为例(centos7): $ docker pull centos:centos7

  • 查看本地镜像 使用以下命令来查看是否已安装了 centos7:

  • 运行容器, 并且可以通过 exec 命令进入 CentOS 容器; $ docker run -itd —name centos-test centos:centos7

(https://www.runoob.com/docker/docker-install-centos.html)

ubuntu 镜像

安装 ubuntu:18.04 PS C:\Users\yang> docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu 5bed26d33875: Pull complete f11b29a9c730: Pull complete 930bda195c84: Pull complete 78bf9a5ad49e: Pull complete Digest: sha256:bec5a2727be7fff3d308193cfde3491f8fba1a2ba392b7546b43a051853a341d Status: Downloaded newer image for ubuntu:18.04 docker.io/library/ubuntu:18.04

  • 安装成功

可以使用 docker images 来列出本地主机上的镜像;

修改docker 目录

//展示当前docker的配置信息 docker info

//在信息找到Docker Root Dir, 对应的就是了, 默认为: Docker Root Dir: /var/lib/docker

修改 /etc/docker/daemon.json

{
  "registry-mirrors": ["http://hub-mirror.c.163.com"], #镜像
  "data-root": "/mnt/data/dockerdata" # 目录
}

//重载 service docker reload

//验证 docker info

错误, 拉取镜像时错误 docker: open /mnt/data/dockerdata/tmp/GetImageBlob166797585: no such file or directory.

解决, 重启docker服务 sudo systemctl restart docker

NVIDIA-Docker

nvidia-docker 是一个可以使用GPU的docker, nvidia-docker 是在docker上做了一层封装, 通过nvidia-docker-plugin, 然后调用到docker上, 其最终实现的还是在docker的启动命令上携带一些必要的参数;