文章目录
- 1.linux安装
- 添加用户组
- 测试
- 配置
- 2.探索
- 镜像初尝试
- 镜像和容器操作一览
- 镜像打包复制
- Docker Hello World详解
- 运行交互式的容器
- 启动容器(后台模式)
- Docker 容器使用
- 主机与容器之间复制文件
- 运行一个web应用
- 3.Docker-compose
- Docker-compose进入容器
- 4.Docker常见错误
- 4.1 permission denied
- 4.2 Failed to get D-Bus connection: Operation not permitted
1.linux安装
sudo apt-get update
# 安装依赖curl
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get -y update
apt-cache madison docker-ce
sudo apt-get -y install docker-ce=5:19.03.5~3-0~ubuntu-bionic
sudo docker version
# centos安装需要自己启动,并设置自启动
sudo systemctl start docker
sudo systemctl enable docker
安装nvidia-docker,用于深度学习环境,不需要则跳过
# 安装nvidia-docker
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
添加用户组
通常安装完docker会建立用户组,查看是否有docker用户组
tail -6 /etc/group
如果没有,创建用户组
sudo groupadd docker
将用户添加到docker用户组
sudo usermod -aG docker user_name
测试
安装完成后测试:查看docker版本以及是否正确安装
$ docker --version
Docker version 19.03, build c97c6d6
$ docker-compose --version
docker-compose version 1.24.1, build 8dd22a9
$ docker-machine --version
docker-machine version 0.16.0, build 9ba6da9
配置
在 Docker 19.03 中,通过修改/etc/default/docker
文件修改配置的方式已经无效
在本版本中可以通过/etc/docker/daemon.json
实现镜像地址的修改,如果没有此文件,可以新建一个:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
执行
systemctl daemon-reload
service docker stop
service docker start
具体配置参数 docker配置参数详解—/etc/docker/daemon.json完整参数
2.探索
镜像初尝试
拉取第一个镜像hello-world,这里本地没有,就从docker镜像仓库拉取并运行。每个仓库有多个镜像,当不指定镜像默认的tag为:latest镜像
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:ca0eeb6fb05351dfc8759c20733c91def84cb8007aa89a5bf606bc8b315b9fc7
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
拉取nginx镜像并运行,这里我们打开浏览器输入http://localhost/
,就可以看到Nginx是否运行成功。
$ docker run --detach --publish=80:80 --name=webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
f5d23c7fed46: Pull complete
918b255d86e5: Pull complete
8c0120a6f561: Pull complete
Digest: sha256:eb3320e2f9ca409b7c0aa71aea3cf7ce7d018f03a372564dbdb023646958770b
Status: Downloaded newer image for nginx:latest
479c79768a03c8bb8aa54b7a9803ceb3ffe8e3562c5077234e57eb0198001999
镜像和容器操作一览
$ docker container ls # 查看运行的容器
$ docker ps -a # 查看已有的容器
$ docker container stop webserver # 停止运行容器webserver
$ docker container ls -a # 查看已有的容器
$ docker container rm webserver # 删除容器webserver
$ docker image ls # 查看已有镜像
$ docker image rm nginx # 删除镜像nginx
镜像打包复制
将镜像打包为一个压缩文件,复制到另一台服务器
# 将容器保存成镜像
docker commit -m "说明" -a "作者" cuda1 cuda-base:2.0
# 将镜像保存成压缩文件
sudo docker save -o /home/app/images/cuda_base_2.tar cuda-base:2.0
sudo scp /home/app/images/cuda_base_2.tar root@ip:/home/app/images/
sudo docker load -i cuda_base_2.tar
Docker Hello World详解
$docker run ubuntu /bin/echo "Hello World"
Hello World
- docker: Docker 的二进制执行文件。
- run:与前面的 docker 组合来运行一个容器
- ubuntu :指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
运行交互式的容器
$ docker run -t -i ubuntu bin/bash
root@dc0050c79503:/#
- -t:在新容器内指定一个伪终端或终端。
- -i:允许你对容器内的标准输入 (STDIN) 进行交互。
- bin/bash 表示载入容器后运行bash,docker必须要保持一个进程的运行,要不整个容器就会退出,整个就表示启动容器后启动bash。
我们尝试在容器中运行命令 cat /proc/version和ls分别查看当前系统的版本信息和当前目录下的文件列表
#cat /proc/version
Linux version 4.9.125-linuxkit (root@659b6d51c354) (gcc version 6.4.0 (Alpine 6.4.0) ) #1 SMP Fri Sep 7 08:20:28 UTC 2018
#ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
启动容器(后台模式)
输出中,没有hello world 我们看到一串长字符,叫做容器id,通过docker ps
查看容器运行情况,使用docker logs
+容器id或容器names查看容器内的标准输出;docker stop
+容器id或容器names停止运行容器。
$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
e1b5fa507dc3063e00a67834fdd313aa97885f20f02c8b953249acccbb221e49 // 容器id
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e1b5fa507dc3 ubuntu "/bin/sh -c 'while t…" 14 seconds ago Up 12 seconds goofy_poitras
$ docker logs e1b5fa507dc3
hello world
hello world
$ docker stop goofy_poitras
goofy_poitras
Docker 容器使用
docker客户端非常简单,我们可以直接输入docker
查看所有命令选项,可以看到主要分为options、commands和Management Commands。
docker command --help
更深入的了解指定的 Docker 命令使用方法。
例如查看stats
的具体使用方法:
$ docker stats --help
Usage: docker stats [OPTIONS] [CONTAINER...]
Display a live stream of container(s) resource usage statistics
Options:
-a, --all Show all containers (default shows just running)
--format string Pretty-print images using a Go template
--no-stream Disable streaming stats and only pull the first result
--no-trunc Do not truncate output
主机与容器之间复制文件
cuda1为容器名字
docker cp ./seq2seq.py cuda1:/home # 将文件复制到容器中
docker cp cuda1:/home/res.json /home/app/nlp # 从容器复制到主机中
运行一个web应用
3.Docker-compose
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
Docker-compose进入容器
有时候我们需要进入Docker-compose的容器做一些修改,这里一个是docker exec -it id命令,另一个是docker attach命令,发现都不行,最后卡死了,因为只有装了bash环境了容器才能进入,如果装了一个mysql这种的,就会卡死。
下面介绍两个很强壮的工具,可以进入docker容器内部。
- 1.docker-compose exec container_name bash
- 2.docker-compose run container_name bash
- 注意是容器的name,不是id
- 需要在右compose-up.yml配置文件的目录下执行
exec回直接进入容器,而run则是在当前容器基础上新建一个一摸一样的容器,相当于clone一个吧。所以exec以后,作修改就是对原来容器的修改,而run的修改则与原来的无关。参考
4.Docker常见错误
4.1 permission denied
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/json: dial unix /var/run/docker.sock: connect: permission denied
修改原理是Docker启动Get Permission Denied #如果还没有 docker group 就添加一个:
$sudo groupadd docker
#将用户加入该 group 内。然后退出并重新登录就生效啦。
$sudo gpasswd -a ${USER} docker
$systemctl restart docker #重启 docker 服务
$newgrp - docker #切换当前会话到新 group 或者重启 X 会话
#注意:最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,
#所以 docker images 执行时同样有错。
参考
4.2 Failed to get D-Bus connection: Operation not permitted
使用centos7.2镜像,启动ssh报以上错误。
需要以特权模式运行容器
$docker run -dit -v /data/centos72:/home/data --net=mcv --ip=172.16.16.231 --privileged=true --name=centos72 kecikeci/centos7.2-tools:latest /usr/sbin/init
$docker exec -it centos72 /bin/bash
$systemctl restart sshd # 容器内执行
Docker容器使用问题:Failed to get D-Bus connection: Operation not permittedStart a service in docker container failed,with error: Failed to get D-Bus connection: No connection to service manager
本文参考
Docker官网菜鸟教程