Docker容器进阶

本章适合服务器Docker用户。PC机Docker用户也可使用如下命令,但是没有这个必要。

容器内添加普通用户-使用exec进入容器内普通用户

容器相当于虚拟linux操作系统。运行镜像产生容器,默认进入容器的root账户。

容器内也可以添加普通用户user_1

useradd user_1

设置密码

passwd user_1

同样可以添加普通用户user_2

进入容器的方式

使用attach命令进入容器时有一个问题。

当多个窗口或Docker组的不同用户同时使用该命令进入同一个容器时,所有的窗口都会同步显示。

如果有一个窗口阻塞了,那么其他窗口也无法操作。

因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。

为了避开这个问题,可以选择docker exec进入容器。

docker exec还可直接以容器内普通用户身份进入容器。

用ctrl+p+q退出容器后,容器仍然处于启动状态。

或者docker start container_id之后,容器进入启动状态。

对于处在启动状态的容器,采用如下命令进入容器的普通用户

docker exec -it -u user_name container_id /bin/bash

普通用户权限受限,跟linux服务器普通用户一样。比如无法访问其他普通用户文件夹。

exec进入之后,即便用exit命令退出容器,容器仍然处于启动状态。

为容器(root账户)设置密码:SSH进入容器

下面为容器设置密码,通过ssh并加密码方式才能进入容器

首先启动一个docker容器

docker run -it --name=container_name image_name

然后在容器内依次执行

yum -y install openssh-server
yum -y install openssh-clients
ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
/usr/sbin/sshd -D

然后打开配置文件

vim /etc/ssh/sshd_config

把里面的

UsePAM yes

设置为

UsePAM no

然后为容器(root)账户设置密码

passwd

exit退出容器,

然后把容器commit为一个新的镜像

docker commit container_id new_image_name

运行新镜像产生新容器(以下方法有时候会导致终端死机,此时很可能已经启动Docker容器成功,只要关闭这个终端,重新开启一个即可

docker run -d -p 10022:22 new_image_name /usr/sbin/sshd -D # d表示后台运行,用-it会提示错误
# -p 10022 表示端口,如果此端口已经用于启动一个容器,则启动新容器需要更改端口,比如改为-p 10021。具体修改规则不详,暂时发现随便修改可行。

此时,无法使用start+attach方式进入容器。

可以ssh进入容器,会提示你输入密码

ssh root@localhost -p 10022

此时即便exit方式退出容器,容器仍然处于运行状态,并未关闭。

此时关闭容器命令

docker stop container_id

运行新镜像产生新容器时,也可以挂在宿主机目录

docker run -d -p 10022:22 --name=container_name -v /HOST_DIR:/CONTAINER_DIR new_image_name /usr/sbin/sshd -D

限定服务器普通用户只有容器使用权限

把普通用户移除Docker组,或者本来就不加入Docker组。加入和移除方法见第二章。

从而服务器普通用户无法使用Docker环境,比如运行镜像产生容器等。

但是服务器root用户可以按照如下步骤赋予服务器普通用户Docker容器使用权限。

接着上述步骤,如果已经退出,则重新进入容器

ssh root@localhost -p 10022

按照本章开始的方法,在容器内添加若干普通用户并设置密码,并分配给服务器上不同的普通用户。

注:容器相当于小型虚拟linux系统,里面也有root账户和普通用户之分。

这样服务器上不同的普通用户能且只能进入容器内对应的普通用户(注意:是同一个容器)

比如,进入容器内部user1用户

ssh user1@localhost -p 10022

此时即便服务器普通用户不在Docker组,也可以ssh进入容器,获得普通用户身份。

因此,Docker组可以只包含root用户,不加入普通用户,只给普通用户分配容器使用权限。

一般容器只安装应用,不存放数据。数据存放在宿主机,通过挂载,容器可以读写宿主机文件。

假设多个服务器用户使用一个容器的不同普通账户,容器只挂载了宿主机一个目录。

此时容器的root用户可以修改挂载的宿主机目录中各种文件(夹)权限,并分配给容器内部各个普通用户。

从而保证容器内部普通用户数据安全。

比如,宿主机目录HOSTDIR已经挂载到容器目录DIR,现在进入DIR,做如下操作

chown user1 file1  # 修改file的所有者为user1
chmod o=- file1    # user1之外用户对file无读写权限,o是字母o,表示others

此时,user2便不能读写file1文件。

注:

Docker容器内部命令行跟linux操作系统一致。

正体现了:Docker容器是一种小型的linux虚拟操作系统。

results matching ""

    No results matching ""