参考资料:
- 通俗易懂了解什么是docker?
- Docker 教程 | 菜鸟教程
- Ubuntu 22.04 安装 Docker
- Docker 超详细基础教程
- WSL2 支持 systemctl 命令
- systemd 和 systemctl 是什么?
- 使用正确的命令重启 WSL 子系统
- Ubuntu 修改源镜像方法
- Docker 中出现 '/etc/resolv.conf': Device or resource busy 错误的处理原因及方式
- Linux中永久设置环境变量 LD_LIBRARY_PATH 的终极指南
文章目录
启用 systemd
本人使用 WSL 作为开发环境,但是它默认使用 init
管理进程;使用 systemctl
时会报错。现在我们在 WSL 中启用 systemd
进程管理器。
bash
cd /etc
su #进入 root 权限
echo 123 > wsl.conf #新建配置
vim wsl.conf
打开配置文件,输入:
[boot]
systemd=true
然后重启 WSL(没法直接 reboot
),进入 cmd
执行
wsl --shutdown
wsl
查看是否成功启用 systemctl
命令行工具,
bash
systemctl list-unit-files --type=service
Docker 安装
首先更新软件包,
bash
sudo apt-get update #拉取列表
sudo apt-get upgrade #实际更新
然后开始安装 Docker,
bash
sudo apt-get install ca-certificates curl gnupg lsb-release
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" #添加软件源
apt-get install docker-ce docker-ce-cli containerd.i #安装docker
sudo usermod -aG docker $USER #配置用户组
然后重启 WSL(和上一节如何启用 systemd 中的步骤一样),启动 Docker 服务
bash
sudo service docker start
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
sudo service docker restart
现在尝试运行一个容器(会自动下载,挺小的),
bash
sudo docker run hello-world
它会打印一些信息。
Docker 使用
基本指令
直接输入 docker
将打印帮助信息,
bash
Usage: docker [OPTIONS] COMMAND
...
各指令的帮助文档,
bash
docker [OPTIONS] --help
查看 docker 版本:
bash
docker version
查看本地镜像(下载/导入):
bash
docker images
删除本地镜像 (需要先 stop
和 rm
对应的容器),
bash
docker rmi hello-world
docker rmi $(docker images -a -q) #删除所有镜像
交互式运行 Ubuntu 22.04
(下载大约 30 MB 的镜像),使用 exit
退出(会结束容器)
bash
docker run -it ubuntu:22.04 /bin/bash #是两个参数 -i 和 -t,但只用其中之一会卡死
后台运行(在容器中运行一个后台程序),
bash
docker run -d ubuntu:22.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
使用如下指令查看所有容器,包括:CONTAINER ID (标志符),IMAGE (镜像),COMMAND (执行的指令),CREATED (创建时间),STATUS (当前状态),PORTS (端口和连接),NAMES(名称)
bash
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9219b814c9a9 ubuntu:22.04 "/bin/sh -c 'while t..." About a minute ago Up About a minute happy_goldberg
查看某个容器内的标准输出流,
docker logs 9219b814c9a9
docker logs happy_goldberg
进入后台容器 ,使用 exit
退出(仍保持后台运行)
bash
docker exec -it 9219b814c9a9 /bin/bash
结束后台容器,
bash
docker stop 9219b814c9a9
docker stop $(docker ps -a -q) #停止所有容器
重启被结束的容器(数据文件都还在),
docker restart 9219b814c9a9
导出容器快照,
bash
docker export 9219b814c9a9 > docker-9219b814c9a9.tar
删除容器(同时也销毁数据),
bash
docker rm 9219b814c9a9
docker rm $(docker ps -a -q) #删除所有容器
从快照导入容器镜像 (使用 docker images
查看是否成功导入)
bash
docker import docker-9219b814c9a9.tar test:v1
然后尝试运行该镜像(成功恢复了数据),
bash
docker run -itd test:v1 bash
数据卷挂载
为了方便 WSL 中容器和 Windows 主机的交互,我们将 WSL 子系统上的 mnt
目录中的某个文件夹,给挂载到某个容器上。注意,挂载的目录不是容器的一部分,在导出镜像时其中的文件不被保留。
首先,在 Windows 主机上新建一个专用目录,例如 D:\Docker
在创建容器时,使用如下指令来挂载目录(挂载到 /root
上),
bash
docker run -v /mnt/d/Docker:/root 34f4123b1ce3
其创建了如下的容器,
bash
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
047bc0c31065 ubuntu:22.04 "bash" 21 seconds ago Up 20 seconds elastic_heisenberg
进入该容器,查看 /root
目录(可以和 Windows 主机共享数据):
bash
docker exec -it 047bc0c31065 bash
cd /root
简单配置容器
新建的容器是空白的,很多工具包都没有(文本编辑器都没有!),因此这里简单配置一下。
直接 apt update
连不上 http://archive.ubuntu.com/ubuntu/,因此要修改 apt
源。我们已经配置了 /root
挂载,因此可以进入 /etc/apt/
,使用如下的指令把要修改的文本复制出来:
bash
cp ./sources.list /root/
然后在 Windows 主机的 D:\Docker
目录内,修改这个文件如下,
bash
# 国内的 apt 源
######## Ubuntu22.04LTS 清华镜像源 ###############
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
######## Ubuntu22.04 阿里云镜像源 ###############
deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
######## Ubuntu22.04 中科大镜像源 ###############
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
如果依然连不上,那就是 DNS 有问题,需要修改 /etc/resolv.conf
文件。但是在 docker 中宿主的 /etc/resolv.conf
被挂载入容器,在容器中没法删除它(总是报错 "rm: cannot remove './resolv.conf': Device or resource busy")。
首先,看一眼文件内容,
bash
cat ./resolv.conf
# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.
nameserver 10.255.255.254
# Based on host file: '/etc/resolv.conf' (legacy)
# Overrides: []
然后,使用如下的替换指令来修改它:
bash
echo "$(sed 's/10.255.255.254/8.8.8.8/g' /etc/resolv.conf)" > /etc/resolv.conf
现在,可以更新软件列表和软件包了,
bash
apt-get update
apt-get upgrade
然后安装一些必要的软件包,
bash
apt install vim wget curl git
apt install gcc g++ make cmake autoconf automake texinfo libtool
还要对 git
换下源,
bash
git config --global url."https://mirror.ghproxy.com/".insteadOf "https://github.com/"
vim ~/.gitconfig