docker安装及使用

Docker 安装

  • 使用 apt 方式安装 docker:
1
2
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
  • 添加阿里云的软件源
1
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  • 向 sources.list 添加 Docker 软件源
1
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 更新软件源,并安装 Docker
1
2
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker 测试

启动 Docker

1
2
sudo systemctl enable docker
sudo systemctl start docker

建立 Docker 用户组

将要使用 Docker 的用户添加到 Docker 的用户组,也就是默认的登录账户

1
2
3
4
# 建立Docker组
sudo groupadd docker
# 将当前用户添加到Docker组中
sudo usermod -aG docker $USER

退出当前终端并重新登录(需要重启系统更新一下),进行如下测试

测试 Docker 是否正常安装

1
docker run --rm hello-world

如果出现一下信息,则说明安装成功

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
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:6e8b6f026e0b9c419ea0fd02d3905dd0952ad1feea67543f525c73a0a790fefb
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Docker 使用

获取 Docker 镜像

Docker Hub上有大量的高质量镜像可以直接使用,此处以 ROS 的镜像为例。

1
2
# 拉取镜像
docker pull osrf/ros:melodic-desktop-full

Docker 启动

1
docker run -it osrf/ros:melodic-desktop-full

此时即启动了一个 bash 终端,允许用户进行交互

挂载主机目录

1
2
3
4
5
# 使用-v参数,如果本地目录不存在,则Docker会自动创建一个文件夹
docker run -it -v /home/jiashi/Src:/home/Src osrf/ros:melodic-desktop-full

# 使用--mount参数,如果本地目录不存在,Docker会报错(推荐)
docker run -it --mount type=bind,source=/home/jiashi/Src/,target=/home/Src osrf/ros:melodic-desktop-full

Docker 网络配置

通常情况下不同终端进入同一个 ROS 容器时,之间的信息是不互通的,相当于两个 ROS Master,可以在运行 Docker 时添加--network host参数,实现 Docker 网络与本机互通。

1
docker run -it --network host osrf/ros:melodic-desktop-full

ROS Docker 图形化界面配置

参考链接

1
2
docker run -it --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" osrf/ros:melodic-desktop-full
export containerId=$(docker ps -l -q)

此时通常会出现以下报错

1
2
No protocol specified
rqt: cannot connect to X server unix:0

再执行一下命令即可

1
xhost +local:root # for the lazy and reckless

常见问题

Docker 容器无法 Tab 补全

参考文章
Docker 中新增了/etc/apt/apt.conf.d/docker-clean用于清除 apt 缓存来减小容器体积,因此需要删除该文件并重新安装bash-completion

1
2
3
4
5
rm etc/apt/apt.conf.d/docker-clean
sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
apt update
apt install -y bash-completion vim
vim /etc/bash.bashrc

将该文件中 35-41 行取消注释

1
2
3
4
5
6
7
8
# enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
1
source /etc/bash.bashrc

此时即可正常 Tab 补全


docker安装及使用
https://fansaorz.github.io/2023/02/12/docker安装及使用/
作者
Jiashi Zhang
发布于
2023年2月12日
许可协议