优点和意义
- 环境隔离、资源共享、节省机器资源
- 轻量虚拟机,启动和运行迅速
使用 Dockerfile 构造镜像
Dockerfile 内容
FROM centos:centos7.4.1708
MAINTAINER Zuocheng Liu
RUN yum -y --nogpgcheck install gcc gcc-c++ kernel-devel make cmake libstdc++-devel libstdc++-static glibc-devel glibc-headers \
&& yum -y --nogpgcheck install openssl-devel gperftools-libs \
&& yum -y --nogpgcheck install psmisc openssh-server sudo epel-release \
&& yum -y --nogpgcheck install vim git ctags \
&& mkdir /var/run/sshd \
&& echo "root:123456" | chpasswd \
&& sed -ri 's/^#PermitRootLogin\s+.*/PermitRootLogin yes/' /etc/ssh/sshd_config \
&& sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config \
&& ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key \
&& ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
创建镜像
docker build -t cpp_dev:last .
创建容器
初始化容器, 宿主机调用脚本
- 挂载容器
- 调用容器内初始化脚本
mount_in_docker.sh
#!/bin/bash
NEWUSER=$1
PORT=$2
PATH=$(dirname $(readlink -f "$0"))
echo "add User ${NEWUSER} sshd Port ${PORT}"
if [ ! -d /data/rtrs/${NEWUSER} ]; then
/usr/bin/mkdir /data/rtrs/${NEWUSER}
fi
/usr/bin/cp /data/liuzuocheng/.profile /data/${NEWUSER}/.profile
/usr/bin/docker run -itd --name ${NEWUSER} --net=host -v /data/${NEWUSER}:/home/${NEWUSER} -v /data:/data rtrs/dev_cpp:centos7.4.1708
/usr/bin/docker exec -i ${NEWUSER} sh ${PATH}/mount_in_docker.sh ${NEWUSER} ${PORT} ${UID}
镜像内调用脚本
- 添加用户
- 启动sshd服务
NEWUSER=$1
PORT=$2
NEWUID=$3
echo "add User ${NEWUSER} sshd Port ${PORT}"
/usr/sbin/useradd -r -u ${NEWUID} -d /home/${NEWUSER} ${NEWUSER}
echo "${NEWUSER}:123456" | /usr/sbin/chpasswd
echo "Port ${PORT}" >> /etc/ssh/sshd_config
/usr/sbin/sshd
其他问题汇总
宿主机docker的目录迁移
docker的默认目录在/var/lib/docker 下面, 往往/var的磁盘比较小,建议把docker的目录改为大磁盘
把用户加入sudoer列表,sudo 执行命令无需密码
修改/etc/sudoers文件, 添加一行 user-name ALL=(ALL) NOPASSWD: ALL
更多问题可参考《Docker使用经验》
现实过程中使用docker搭建C/C++ 开发环境的工程意义
- 新人入职代码培训,降低学习成本
- 推动公司平台化建设