2020-03-23
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: 企业版)
基本概念
docker 镜像(Image)
docker镜像类似于虚拟机镜像,可以将其理解为一个只读模板。除了提供容器运行时所需的程序、库、资源、配置等文件外,docker镜像还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。
docker 容器(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:
-
Most users set up Docker’s repositories and install from them, for ease of installation and upgrade tasks. This is the recommended approach.
-
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.
-
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
- Set up Docker’s
aptrepository.
# 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
- Install the Docker packages.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginVerify 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 专业版系统的安装包
- 需要 BOIS 启用CPU虚拟化
- 需要 windows 开启Hyper-V功能
- 安装 Toolbox 最新版 Toolbox 下载地址: https://www.docker.com/get-docker
配置服务
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
容器
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 bf08b7f2cd89 或 docker 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 bashWhen 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.
镜像
镜像源
科大镜像: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
- Settings → Docker Engine
- 配置”registry-mirrors”
- 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:
- Using environment variables (
HTTP_PROXY,HTTPS_PROXY, andNO_PROXY). - Using the
http-proxy,https-proxy, andno-proxyfields in the daemon configuration file (Docker Engine version 23.0 or later). - Using the
--http-proxy,--https-proxy, and--no-proxycommand-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:latest
或
docker 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的启动命令上携带一些必要的参数;