docker 容器使用systemctl
以ubuntu做为参考。
拉取容器
-
直接拉取
使用
docker pull ubuntu
直接拉取。 -
通过Dockerfile拉取
Dockerfile:
# 基础镜像 FROM ubuntu:18.04 # build参数 ARG user=duapple # 元数据 LABEL maintainer="hejiang" email="2832893880@qq.com" # 安装依赖 #RUN apt-get update && apt-get install -y sudo # 添加用户:赋予sudo权限,指定密码 RUN useradd --create-home --no-log-init --shell /bin/bash ${user} \ && adduser ${user} sudo \ && echo "${user}:123123" | chpasswd # 改变用户的UID和GID #RUN usermod -u 1000 ${user} && usermod -G 1000 ${user} # 指定容器起来的工作目录 WORKDIR /home/${user} # 指定容器起来的登录用户 USER {user}
拉取:
$ docker build -t ubuntu1804:test .
如果不具备上网能力,可以先不安装sudo,在进入系统后,设置好软件源以后再安装sudo。
# 配置容器
这里以docker拉取的镜像为例子。直接拉取镜像的方式,需要手动创建非root用户,其余操作与下文保持一直。
无Dockerfile的情况,新建用户脚本,执行前需要先安装sudo。
add_user.sh
:
#!/bin/bash
user=$1
echo "add user: ${user}"
useradd -d /home/${user} -m ${user}
passwd ${user}
usermod -g ${user} -G root ${user}
chmod u+w /etc/sudoers
echo "${user} ALL=(ALL:ALL) ALL" >> /etc/sudoers
chmod u-w /etc/sudoers
usermod -s /bin/bash ${user}
# add_user.sh duapple
注意:需要使用systemctl,就不能用非root用户启动容器,否则尽管设置了/sbin/init作为第一个进程启动,systemctl还是不能使用。(另外,为什么创建容器不直接指定运行/sbin/init?因为安装的容器可能内部并没有安装systemd,比如我用的ubuntu容器,内部就没有安装systemd,也就没有/sbin/init,这会导致启动容器失败。因此需要先进入容器,安装好systemd,在对配置进行修改。)
创建容器并运行。注意:需要设置 --privileged
参数,确保能获取到真正的root权限。
$ docker run --privileged -itd --name ubuntu_test -u root ubuntu1804:test /bin/bash
$ docker exec -it ubuntu_test /bin/bash
修改root密码并安装sudo。
# passwd
# apt update
# apt install sudo
切换到duapple用户。测试sudo,并安装systemd。
# exit
$ docker exec -it -u duapple ubuntu_test /bin/bash
$ sudo apt install systemd
$ ls -al /sbin/init
下载ssh,进行测试。
$ sudo apt install ssh
$ sudo systemctl start ssh
此时会报错:
配置容器的第一个进程:
$ exit
$ docker stop ubuntu_test
$ sudo systemctl stop docker
# sudo su
#
修改 config.v2.json
中的 Path
和 Cmd
,由 /bin/bash
设置为 /sbin/init
。注意:一定要先关闭docker服务,修改配置才能生效。
# vim /var/lib/docker/containers/0f22b0c68de9819eb72d02094a5d23d3ee66e4eabd3563b9190f48ac83c55f22/config.v2.json
保存修改后,重启docker,再重启docker容器,重新配置即可。
$ docker start ubuntu_test
$ docker exec -it -u duapple ubuntu_test /bin/bash
$ sudo systemctl start ssh
$ sudo systemctl status ssh