【ubuntu】ubuntu下docker的使用
git和github建立连接
- 安装
- windows安装的重点(Hyper-V和WSL)
- 安装Docker
- 加速镜像
- 配置国内仓库
- 配置HTTP/HTTPS代理
- 配置docker.service代理
- 验证
- 操作
- 镜像和容器
- 基本操作
- 一些问题
- 权限问题
- 命令失效
- 显卡问题
- 图形界面
- VcXsrv
- 通过Dockerfile制作
- 新的Dockerfile
安装
windows安装的重点(Hyper-V和WSL)
Hyper-V:Windows自带的虚拟化技术,可以使用它创建Linux虚拟机,从而实现在Windows上运行Docker
WSL:Win10、Win11等自带的Linux子系统,全称Windows Subsystem for Linux。可以利用WSL在Windows上运行Docker
官网下载安装包
安装Docker
Bilibili安装Docker的教程
加速镜像
配置国内仓库
修改Docker的配置文件daemon.json来配置镜像加速器,可以加速Docker镜像的拉取速度
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://ueo0uggy.mirror.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://cf-workers-docker-io-apl.pages.dev",
"http://95.169.25.181"
]
}
重启Docker服务
sudo systemctl restart docker
通过docker info查看当前Docker配置,包括是否成功加载
docker info | grep -i 'Registry Mirrors'
如果配置成功,您会看到类似以下的输出:
Registry Mirrors:
https://hub-mirror.c.163.com
https://docker.mirrors.ustc.edu.cn
https://ueo0uggy.mirror.aliyuncs.com
https://docker.m.daocloud.io
https://cf-workers-docker-io-apl.pages.dev
http://95.169.25.181
配置HTTP/HTTPS代理
修改daemon.json文件,配置HTTP和HTTPS代理。
sudo vim /etc/docker/daemon.json
这里的http://127.0.0.1是主机地址,7890是代理端口,CLASH默认的的代理就是这样
{
"proxies": {
"http-proxy": "http://127.0.0.1:7890",
"https-proxy": "http://127.0.0.1:7890"
}
}
重启Docker服务
sudo systemctl restart docker
验证代理配置是否生效:
docker info | grep -A 1 ' HTTP Proxy'
输出的结果:
WARNING: bridge-nf-call-iptables is disabled
HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890
WARNING: bridge-nf-call-ip6tables is disabled
配置docker.service代理
直接在 Docker 服务的启动配置中设置代理。通过编辑docker.service文件来配置
查看docker.service文件的位置:
systemctl status docker
输出为docker.service文件的路径:
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
编辑docker.service文件,在[service]部分添加代理环境变量:
sudo vim /lib/systemd/system/docker.service
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890/"
Environment="HTTPS_PROXY=http://127.0.0.1:7890/"
重载docker.service配置,重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker
验证
通过拉取一个镜像来检查是否使用了镜像加速器
docker pull hello-world
查看docker启动日志
sudo journalctl -u docker.service
操作
镜像和容器
基本操作
# 启动docker
sudo service docker start
# 重启docker
sudo service docker restart
# 停止docker
sudo service docker stop
一些问题
权限问题
通常情况下会发生没有权限执行Docker命令,需要添加Docker用户组,或者一直使用sudo命令
sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo systemctl restart docker
su root
su ${USER}
命令失效
如果重复安装docker,会出现docker命令失效的情况,因为重复创建 ./docker目录文件夹
sudo rm -rf ~/.docker/
显卡问题
nvidia-docker的问题,在docker中运行程序,使用显卡进行运算
(作者未验证)需要添加容器的环境变量NVIDIA_DRIVER_CAPABILITIES=compute,utility和NVIDIA_VISIBLE_DEVICES=all
docker run -itd --gpus all --name 容器名 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all 镜像名
或者在Dockerfile中添加:
ENV NVIDIA_VISIBLE_DEVICES=all NVIDIA_DRIVER_CAPABILITIES=compute,utility
LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
图形界面
配置Docker子程序的图形界面有多种方案,现罗列如下:
要在docker中运行GUI程序,关键是让Docker知道X Server(大多数Linux桌面环境的基础)。
文章的核心就在以下参数:
share the Host’s DISPLAY environment variable to the Container
--env="DISPLAY"
run container with host network driver with
--net=host
$ docker run --net=host --env="DISPLAY"
引用自running-gui-applications-inside-docker-containers
上述参数的含义就是将Linux宿主机的X_Server
共享给Docker容器,还有一种方式就是映射宿主机X_Server
的.sock
文件到容器中去。
在Windows或Mac这些没有X11的Host机器上怎么办呢?
VcXsrv
VcXsrv Windows X Server是Windows上的X11程序,另外还可选择Xming,但Xming最后一次更新是在2016年,代码相对较老,所以还是选择VcXsrv吧。
VcXsrv程序下载安装步骤可以参考Run GUI app in linux docker container on windows host。
然后从开始菜单运行 Xlaunch,并按照初始配置步骤进行操作:
通过Dockerfile制作
FROM ubuntu:18.04
# 修改源地址
RUN mv /etc/apt/sources.list /etc/apt/sources_backup.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security multiverse " >> /etc/apt/sources.list &&
echo "deb http://archive.canonical.com/ubuntu bionic partner " >> /etc/apt/sources.list &&
# 安装firefox
apt-get update && apt-get install -y firefox
CMD /usr/bin/firefox
构建镜像
docker build -t firefox .
运行容器container
docker run -ti --rm -e DISPLAY=host.docker.internal:0.0 firefox
相较原文有如下变动:
- 删除了
set-variable -name DISPLAY -value YOUR-IP:0.0
命令 - 设置容器的
DISPLAY
参数为host.docker.internal
而不是宿主机的具体ip
原文的set-variable
作用是将宿主机的ip作为临时环境变量,在docker run
的时候直接引用该环境变量赋值给容器的DISPLAY
,可有可无,并且set-variable
只能在PowerShell
环境生效,因此直接删除。
再来看-e DISPLAY=host.docker.internal:0.0
,从18.03版本开始,Docker推荐容器使用host.docker.internal
来访问宿主机上的服务,容器的DNS会自动解析到宿主机的内部IP上,参考Docker for Windows的官方文档:I WANT TO CONNECT FROM A CONTAINER TO A SERVICE ON THE HOST。
因为Docker build时未指定ubuntu的locales,ubuntu的镜像默认不支持中文导致的
新的Dockerfile
FROM ubuntu:18.04
# 修改源地址
RUN mv /etc/apt/sources.list /etc/apt/sources_backup.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-updates multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security universe " >> /etc/apt/sources.list &&
echo "deb http://mirrors.ustc.edu.cn/ubuntu/ bionic-security multiverse " >> /etc/apt/sources.list &&
echo "deb http://archive.canonical.com/ubuntu bionic partner " >> /etc/apt/sources.list &&
# 更新并安装国际化语言包以及中文字体
apt-get update &&
apt-get install -y locales &&
locale-gen zh_CN &&
locale-gen zh_CN.utf8 &&
apt-get install -y ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy
# 设置系统语言环境为中文UTF-8
ENV LANG zh_CN.UTF-8
ENV LANGUAGE zh_CN.UTF-8
ENV LC_ALL zh_CN.UTF-8
# 安装firefox
RUN apt-get install -y firefox
CMD /usr/bin/firefox
网上还有几种方式,我只看了文章的理论,感觉可行,大家有空可以去亲自尝试一番:
● Xvfb + VNC - Xvfb + VNC
● Xming - Xming
● SSH with X11 forwarding - SSH with X11 forwarding
● X11docker - 一个专门为Docker增加X11图形渲染支持的项目 X11docker