跳转至

Docker使用笔记

约 722 个字 11 行代码 预计阅读时间 4 分钟

安装docker

按照https://docs.docker.com/engine/install/ubuntu/的说明安装即可

也可以按curl -fsSL https://get.docker.com -o get-docker.shsudo sh get-docker.sh来安装。

设置docker使用镜像仓库

docker默认从官网拉取镜像,可能由于墙而拉不到。可以考虑使用阿里提供的镜像服务,参考https://zhuanlan.zhihu.com/p/347643668

考虑到国内似乎把docker镜像下架了,还是直接修改docker代理吧。

先创建目录mkdir /etc/systemd/system/docker.service.d,再创建文件/etc/systemd/system/docker.service.d/http-proxy.conf,再往里面添加代理:

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
Environment="HTTPS_PROXY=http://proxy.example.com:80/"
Environment="NO_PROXY=localhost,127.0.0.0/8,docker-registry.somecorporation.com" #可选。如果使用本地镜像仓库。

然后更新配置sudo systemctl daemon-reload,并重启docker:sudo systemctl restart docker

指定镜像保存位置

默认使用的位置是/var/lib/docker,在根目录下容易占满。可以通过docker info查看保存的位置Docker Root Dir。

配置文件可以通过systemctl status docker并查看Load使用的配置文件是哪个。

一种指定镜像保存位置的方法:修改/etc/docker/daemon.json,设置为

{
  "data-root": "/home/docker"
}

随后重载一下配置:

sudo systemctl daemon-reload
sudo systemctl restart docker

还有一种做法,适用于已经使用过一段时间的docker,关闭docker后mv原来的/var/lib/docker到新目录(比如/data/docker)然后再ln -s /data/docker /var/lib/docker建立软链接。

从镜像创建容器并挂载目录

会在容器中创建目录,映射宿主机目录。宿主机的目录和容器目录内容是一样的,修改一方,另一方随之改变

docker run -it --name=<container_name> --user=<user_id>:<group_id> --hostname=xxxx --workdir=xxxx  -v /etc/passwd:/etc/passwd:ro -v /etc/group:/etc/group:ro --mount type=bind,source=<宿主机目录>,target=<容器目录> <镜像名>:<tag> /bin/bash

以上命令可以完成对指定镜像创建一个比较完备的容器,指定了容器名称、用户名称和组别、主机名、用户工作目录,并挂载了主机的一些目录。指定passwd和group文件的只读挂载可以避免–user使用用户(组)id进行新建容器时引发的找不到用户名和组名的问题。并且避免了默认root用户导致的主机端无法访问容器新建文件的问题。

注意这样创建的用户没有root权限。如果需要,则不使用user参数,但存在容器创建文件是root,宿主机无法修改的问题。

一个不太聪明的解决方法是user_id设成root的0,group_id设成普通用户,然后在容器里给root的.bashrc加一行umask 0002。就是说让用户组也能修改文件了。

一些其他的办法:docker exec -u好像可以指定启动容器时的用户,不知道有什么用,可以试试;或者root进去以后把普通用户加到sudoers里

新容器初始化

apt-get update更新一下list,然后才能使用apt-get下载其他包。一些常用的包:apt-get install build-essential

退出初次创建的容器

连按Ctrl+PCtrl+Q退出容器。否则简单退出后容器就stop了,下次exec的时候还要restart,甚至还会出现restart自动又stop的情况

进入已有的容器

docker exec -it <容器id> /bin/bash

可以Ctrl+D退出