Docker安装及使用

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  # 从容器复制到主机中

以宿主机用户运行

docker run --user $(id -u $USER):$(id -g $USER) -v /etc/passwd:/etc/passwd -v /etc/group:/etc/group ...

解决Docker以默认root用户运行生成的文件权限为root的问题

运行一个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 permitted
Start a service in docker container failed,with error: Failed to get D-Bus connection: No connection to service manager

本文参考
Docker官网
菜鸟教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值