之前用的vmware虚拟机的ubuntu做开发环境,但是不知道为啥,网速很慢,然后我就去找doker用了。这里只简单记录一下。(速度慢找到原因了,我的电脑ip网段变了,而虚拟机被我设置是把主机当代理服务器用的,而且git还单独设置了,更新ip地址后一切正常了)
首先我下载了windowns桌面版,这个好像是win10才能用。
下面简单说下我对docker相关名词的印象,像镜像,容器之类的。
镜像,感觉就和装系统用的镜像是差不多的东西。当然docker好像是分层的,pull一个镜像要下好几个东西。
容器,感觉就是镜像的实例化,一个镜像可以实例化为好几个容器。
doker hub,这个感觉可以对标github了,这个里面有很多镜像,包括官方的,私人上传的–自己可以创建仓库上传你构建的镜像。
play with docker是一个在linux终端,允许你运行docker命令的交互式环境,基于云,无需下载。
数据库持久化的两种方式:命名卷和绑定挂载。命名卷的本地位置无需你指定,绑定挂载的本地位置需要自己指定
这是在桌面版上绑定挂载的填写,Host Path填写本地电脑的地址,Contiainer Path填写容器里挂载的点。我刚开始没理解这个,一直没搞好,感觉还是用命令方便一点。这里的绑定挂载感觉就像是vmware虚拟机里的共享文件夹。
使用docker的好处应该就是轻量化,体积比虚拟机小的多,假如我现在需要一个ruby环境来开发,我只需要去docker hub把官方的ruby镜像pull下来,然后运行,一个ruby开发环境就搭好了,不需要你去配置各种参数,各种命令。
docker镜像还可以push,pull,使得保存/获取开发环境变得简单。
可定制化的容器构建让个性化定制成为可能。
多容器app也很神奇,多个容器可以运行不同app,可以组网,比如一个容器运行mysql,一个容器运行你的前端app。
其他的应用尚待探索。
注意:若你的电脑同时安装了vmware,可能会出现问题,此时需要禁用hype-v或更新vmware,这取决于你的win10版本。
远程访问容器
- 启动容器
docker run -dit -p 5000:22 --name bentutu -h bentutu --privileged=true -v D:/docker_save:/opt/xwd ubuntu
不加 --privileged=true会导致nfs挂在不了。
2. openssh-server服务配置
apt install openssh-server
sudo service ssh start
sudo update-rc.d ssh defaults
3. 免密登录
修改ssh配置文件相关配置。
把公钥拷贝到~/.ssh/authorized_keys
目录,可以参考windows无法使用ssh-copy-id解决办法将windows公钥拷贝,其他平台的可以把公钥内容直接追加在这个文件后面。
4. ssh登录
然后ssh root@{宿主机ip} -p 5000就可以远程访问docker了
配置实例
docker run -it --cpus ${docker_cpu_limit} -h `hostname`_${image##*/} --dns 10.1.2.80 ${docker_opt} ${arg} -v /home/${USER}:/home/${USER} -v /home/coverity:/home/coverity:ro -v /home/jenkins:/home/jenkins:ro -v /share/${USER}:/share/${USER} -v /bin/xcp:/bin/xcp:ro -w /home/${USER} --rm --name ${USER}_`openssl rand -base64 8 | md5sum | cut -c1-8` ${image} /bin/bash -c "groupadd -g 1000513 domain_users 2>/dev/null ; export SHADOW_ALLOW_ALL_NUMERIC_USER=1 && useradd -d /home/${USER} -s /bin/bash -g domain_users -u ${rid} ${USER} 2>/dev/null || useradd -d /home/${USER} -s /bin/bash -g domain_users -u ${rid} --badnames ${USER} 2>/dev/null ; echo ${USER}:123456 | chpasswd 2>/dev/null ; echo '%domain_users ALL=(ALL) NOPASSWD: ${sudo_opr}' >> /etc/sudoers 2>/dev/null ; su - ${USER}"
这是一个docker run命令,用于在Docker容器中运行指定的映像并执行一系列操作。
解释上述代码:
docker run:运行Docker容器的命令。
-it:分配一个交互式的终端并将其连接到容器的标准输入、输出和错误输出。
–cpus
d
o
c
k
e
r
c
p
u
l
i
m
i
t
:限制容器对处理器资源的使用,使用
{docker_cpu_limit}:限制容器对处理器资源的使用,使用
dockercpulimit:限制容器对处理器资源的使用,使用{docker_cpu_limit}变量来指定CPU限制。
-hhostname_${image##*/}:设置容器的主机名,它是当前主机名加上映像的名称(取映像路径中的最后一个部分)。
–dns 10.1.2.80:使用指定的DNS服务器来设置容器的DNS解析。
${docker_opt}:指定其他的Docker选项,这个变量可能包含其他的Docker参数。
a
r
g
:指定其他的命令行参数,这个变量可能包含其他的命令行参数。
−
v
/
h
o
m
e
/
{arg}:指定其他的命令行参数,这个变量可能包含其他的命令行参数。 -v /home/
arg:指定其他的命令行参数,这个变量可能包含其他的命令行参数。−v/home/{USER}:/home/
U
S
E
R
−
v
/
h
o
m
e
/
c
o
v
e
r
i
t
y
:
/
h
o
m
e
/
c
o
v
e
r
i
t
y
:
r
o
−
v
/
h
o
m
e
/
j
e
n
k
i
n
s
:
/
h
o
m
e
/
j
e
n
k
i
n
s
:
r
o
−
v
/
s
h
a
r
e
/
{USER} -v /home/coverity:/home/coverity:ro -v /home/jenkins:/home/jenkins:ro -v /share/
USER−v/home/coverity:/home/coverity:ro−v/home/jenkins:/home/jenkins:ro−v/share/{USER}:/share/
U
S
E
R
−
v
/
b
i
n
/
x
c
p
:
/
b
i
n
/
x
c
p
:
r
o
:将主机上的文件
/
目录挂载到容器内的相应路径,用于共享文件和目录。
{USER} -v /bin/xcp:/bin/xcp:ro:将主机上的文件/目录挂载到容器内的相应路径,用于共享文件和目录。
USER−v/bin/xcp:/bin/xcp:ro:将主机上的文件/目录挂载到容器内的相应路径,用于共享文件和目录。{USER}是当前登录用户的用户名。
-w /home/
U
S
E
R
:设置容器的工作目录为
{USER}:设置容器的工作目录为
USER:设置容器的工作目录为{USER}用户的主目录。
–rm:容器退出后自动删除容器。
–name ${USER}_openssl rand -base64 8 | md5sum | cut -c1-8``:为容器指定一个唯一的名称,名称由当前用户的用户名加上随机生成的8位哈希字符串构成。
${image}:指定要运行的Docker映像。
/bin/bash -c groupadd -g 1000513 domain_users 2>/dev/null ; export SHADOW_ALLOW_ALL_NUMERIC_USER=1 && useradd -d /home/12345 -s /bin/bash -g domain_users -u 1206681 12345 2>/dev/null || useradd -d /home/12345 -s /bin/bash -g domain_users -u 1206681 --badnames 12345 2>/dev/null ; echo 12345:123456 | chpasswd 2>/dev/null ; echo '%domain_users ALL=(ALL) NOPASSWD: /bin/xcp' >> /etc/sudoers 2>/dev/null ; su - 12345
这段代码是一个shell命令,执行了一系列操作:
groupadd -g 1000513 domain_users 2>/dev/null: 创建一个用户组 domain_users,组ID为1000513。命令的输出错误信息被重定向到/dev/null,即被丢弃。
export SHADOW_ALLOW_ALL_NUMERIC_USER=1:设置环境变量SHADOW_ALLOW_ALL_NUMERIC_USER为1。该变量是用来允许使用纯数字作为用户名。
useradd -d /home/12345 -s /bin/bash -g domain_users -u 1206681 12345 2>/dev/null || useradd -d /home/12345 -s /bin/bash -g domain_users -u 1206681 --badnames 12345 2>/dev/null:尝试创建用户12345,其主目录为/home/12345,登录shell为/bin/bash,所属用户组为domain_users,用户ID为1206681。如果该用户名已存在,会尝试使用–badnames标志重新创建用户。命令的输出错误信息同样被重定向到/dev/null。
echo 12345:123456 | chpasswd 2>/dev/null:将用户12345的密码设置为123456。命令的输出错误信息被重定向到/dev/null。
echo ‘%domain_users ALL=(ALL) NOPASSWD: /bin/xcp’ >> /etc/sudoers 2>/dev/null:将%domain_users ALL=(ALL) NOPASSWD: /bin/xcp这一行内容追加到/etc/sudoers文件中,允许组domain_users的用户在执行/bin/xcp命令时不需要密码验证。命令的输出错误信息被重定向到/dev/null。
su - 12345:切换到用户12345并启动一个交互式的shell会话。
整段代码实际上是在进行一系列操作,其中包括创建用户组、创建用户、设置密码、授权sudo权限,并最后切换到创建的用户账户。