0
点赞
收藏
分享

微信扫一扫

Docker安装及使用

女侠展昭 2022-12-05 阅读 212


文章目录

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

本文参考
​​​Docker官网​​​​菜鸟教程​​


举报

相关推荐

0 条评论