docker 入门

docker 入门

没错!都 2020 年了,我居然才开始使用 docker,一上手就让我幸福感倍增~

1 简介

为啥我刚刚说 docker 让我提升了幸福感呢?主要是它解决了一个非常头疼的问题——「环境问题」!在不同操作系统中,以及相同操作系统不同版本,甚至于完全一致的软硬件,在搭建环境时依然可能出现各种奇怪的问题。如果你做过开发,你肯定知道我在说什么。

docker 是一个 Linux 容器的封装,即 Linux Containers (LXC)。容器就是一个罐子,罐子和外界分离开,我们在里面运行代码,外面的事情全部交给 docker 来处理。

这样一说是不是感觉和一个东西特别像,没错!就是虚拟机。虚拟机是在一个操作系统上运行另外一个操作系统的技术,非常消耗资源!和虚拟机不同 docker 只是一个在进程外面套了一个保护层,是一种非常轻量级的虚拟技术。

简而言之,docker 让你摆脱环境的烦恼~

2 安装

docker 的安装非常简单,官方给了详细的文档,你可以在里面找到适合你的版本。

Mac 下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
brew install docker
# 安装完成后,在「应用程序」里找到 Docker.app,点击启动

# 如果安装成功的话,当你在 shell 中输入
docker version
# 会有下面类似的输出
# Client: Docker Engine - Community
# Version: 19.03.8
# API version: 1.40
# Go version: go1.12.17
# Git commit: afacb8b
# Built: Wed Mar 11 01:21:11 2020
# OS/Arch: darwin/amd64
# Experimental: false
# ...

ubuntu 下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更新索引
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates \
curl gnupg-agent software-properties-common

# 添加 docker key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 设置稳定版本库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 安装 docker-ce
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

小问题

  1. 不加 sudo 会报没有权限。
1
2
3
4
5
6
7
8
9
# 查看有没有 docker 用户组
groups $USER
# 如果没有的话,就手动创建一个
sudo groupadd docker

# 然后将当前用户加入到 docker 的用户组里
sudo gpasswd -a $USER docker
# 最后更新用户组
newgrp docker

3 功能

有几个比较常用的概念,我想先单独说明一下。

  1. image:又名镜像,它有点像操纵系统的镜像文件本身,或者说是一个模版。
  2. container:又名实例,它是基于 image 生成的容器实例,可以看作是 image 的副本。
  3. Dockerfile:生成 image 的配置文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 下载一个镜像,以 ubuntu:16.04 为例
docker pull ubuntu:16.04
# 16.04: Pulling from library/ubuntu
# e92ed755c008: Pull complete
# b9fd7cb1ff8f: Pull complete
# ee690f2d57a1: Pull complete
# 53e3366ec435: Pull complete
# Digest: sha256:db6697a61d5679b7ca69dbde3dad6be0d17064d5b6b0e9f7be8d456ebb337209
# Status: Downloaded newer image for ubuntu:16.04
# docker.io/library/ubuntu:16.044

# 查看所有 image
docker image ls
# REPOSITORY TAG IMAGE ID CREATED SIZE
# ubuntu 16.04 005d2078bdfa 7 weeks ago 125MB

# 启动一个实例,以交互模式运行
docker container run -it ubuntu:16.04
# root@506f4389875e:/#

# 查看正在运行的实例(在另外一个shell中输入)
docker container ls
# CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 506f4389875e ubuntu:16.04 "/bin/bash" About a minute ago Up 10 seconds brave_hermann

# 关闭实例
docker container kill 506f4389875e

# 删除实例
docker container rm 506f4389875e

# 将 container 封装成 image
docker commit container_id image_name:tag

4 Dockerfile

新建 Dockerfile 文件,按照下方案例写入配置。

1
2
3
4
5
6
7
FROM ubuntu:16.04:继承自镜像 ubuntu:16.04
COPY . /app:将当前目录下的所有文件拷贝到 /app 路径;
WORKDIR /app:镜像的工作路径为 /app;
RUN cd back:执行 shell 命令;
RUN pip install -r requirements.txt:执行 shell 命令;
EXPOSE 8080:暴露 8080,外部连接连接这个端口;
EXPOSE 8081:暴露 8081,外部连接连接这个端口。

构建镜像:

1
2
# test-app 是 image 名字,0.1.0 是标签
docker image build -t test-app:0.1.0

一个新的镜像就构建成功了!你可以在本地自己使用,也可以把它放到云上供所有人使用!我们常说,「做事要站在巨人的肩膀上」,而 docker 镜像就是那个巨人肩膀~

5 nvidia-docker

深度学习应用要用 GPU 跑模型,而普通的 docker 无法直接使用,我们需要使用专用的 nvidia-docker 才行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 安装
# Ubuntu 16.04/18.04/20.04, Debian Jessie/Stretch/Buster
# 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 update
sudo apt install -y nvidia-docker2
sudo systemctl restart docker

# 运行
#### Test nvidia-smi with the latest official CUDA image
docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

# Start a GPU enabled container on two GPUs
docker run --gpus 2 nvidia/cuda:10.0-base nvidia-smi

# Starting a GPU enabled container on specific GPUs
docker run --gpus '"device=1,2"' nvidia/cuda:10.0-base nvidia-smi
docker run --gpus '"device=UUID-ABCDEF,1"' nvidia/cuda:10.0-base nvidia-smi

# Specifying a capability (graphics, compute, ...) for my container
# Note this is rarely if ever used this way
docker run --gpus all,capabilities=utility nvidia/cuda:10.0-base nvidia-smi

6 参考

作者

Ailln

发布于

2020-02-10

更新于

2024-03-02

许可协议

评论