本文主要介绍了使用 Docker 来制作CentOS 环境的镜像,并上传到阿里云的 Docker 镜像仓库,其他有需要的可以通过连接拉取下载。我们在做开发时常常需要一些环境进行测试或者部署,在了解某个开源项目时也需要一个符合要求的环境下部署上手使用,但有时测试环境较杂乱,比如安装部署 Apache Druid时使用默认端口启动时可能会因为某些端口占用而启动失败,可以通过修改默认端口,但是对于刚上手使用的用户手动改动几个端口对于本来还不熟悉项目的人来说可能会令人困惑,虽然也可以通过虚拟机来创建一个新的环境,但这样比较麻烦, Docker 是个比较好的选择,仅需几个命令就可以启动运行一个容器,配上国内镜像源拉取下载速度是比较快的,不用时直接使用 docker 命令删除,对于自己的某个需求还可以制作符合自己使用需求的镜像,这样就实现了快速拉取、快速启动、快速移除和快速发布。
中文环境基础版 Centos7 镜像。在 CentOS 7 的镜像基础上,又添加了 vim、lsof、wget、tree、python-devel、c 编译环境、ssh服务。系统 root 密码为 2020:
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003_v1
sudo docker pull registry-internal.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003_v1
开发环境版 Centos7 镜像。在 中文环境基础版镜像基础上,又添加了 JDK8、Git、Maven、Nginx、Node.js服务。系统 root 密码为 2020
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003-dev_v1
sudo docker pull registry-internal.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003-dev_v1
中文环境基础版镜像。在 开发环境版 Centos7 镜像基础上添加了 MySQL 5.7 服务。系统 root 密码为 2020,mysql 的 root 用户密码为 123456
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:dev-mysql_v1
sudo docker pull registry-internal.cn-shanghai.aliyuncs.com/yore/bigdata:dev-mysql_v1
# 1 查看系统中是否已经安装了 Docker
systemctl status docker
rpm -qa | grep -E "docker"
## 1.1 如果重新安装可以先卸载旧版本 Docker
yum remove docker-ce
rm -rf /var/lib/docker
## 1.2 更新系统包
yum -y update
# 2 访问如下网站,下载 Docker RPM 包
# https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
# 例如下
wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-18.06.3.ce-3.el7.x86_64.rpm
# 3 安装
yum install docker-ce-18.06.3.ce-3.el7.x86_64.rpm
# 4 启动
systemctl start docker
## 查看信息
docker info
这里配置为阿里的镜像。访问阿里云官网 https://www.aliyun.com/ 登陆账号,进入管理控制台 --> 产品与服务 --> 弹性计算 --> 容器镜像服务 --> 镜像加速器,复制自己的专属加速器地址。
vim /etc/docker/daemon.json
# 添加自己的镜像地址,保存退出
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
重新加载文件重启 docker
systemctl daemon-reload
systemctl restart docker
# 查看启动状态
systemctl status docker
Dockerfile 形式,将下面配置内容放到环境中的某个目录下 的Dockerfile 文件中。最后执行构建命令 docker build -t yore/centos7_v1 .
后面的 .
表示当前路径。主要拉取一个 centos 7 最新版本,并安装和设置中文语言环境。
FROM centos:7.8.2003
ENV LANG=zh_CN.UTF-8 \
LANGUAGE=zh_CN:zh \
LC_ALL=zh_CN.UTF-8
# Install tools
RUN yum update -y && \
yum reinstall -y glibc-common && \
yum install -y telnet net-tools && \
yum clean all && \
rm -rf /tmp/* rm -rf /var/cache/yum/* && \
localedef -c -f UTF-8 -i zh_CN zh_CN.UTF-8 && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# Define default command.
CMD ["bash"]
查看本地镜像
# 查看镜像。会看到两个,一个是原始镜像,一个是自定义配置后的镜像
docker images
# 1 运行。下面会对本容器做进一步的修改设置
# -d 后台运行容器
# -p 指定端口映射,格式为:主机(宿主)端口:容器端口
# --name="yore_centos7" 为容器指定一个名称
# -h "hostname" 指定容器的hostname;
# -m 设置容器使用内存最大值;
# --volume、-v 绑定一个卷
# --privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
# --cap-add=[], 添加权限,权限清单详见:http://linux.die.net/man/7/capabilities
docker run --privileged=true --cap-add SYS_ADMIN -e container=docker -it \
-p 30022:22 -p 30080:80 -h "bigdata" \
--name="centos7_base" -d yore/centos7_v1:latest /usr/sbin/init
# 2 启停容器
## 2.1 关闭容器
docker stop $CONTAINER_ID
## 2.2 启动某个容器
docker start $CONTAINER_ID
## 2.3 移除容器
docker rm -f $CONTAINER_ID
# 3 删除镜像
## image rm 等价于 rmi
docker image rm $IMAGE_ID
## 如果有多个相同的 IMAGE ID 的删除
docker rmi $REPOSITORY:$TAG
# 4 进入容器
docker exec -it $CONTAINER_ID /bin/bash
## 查看当前容器中 Centos7 版本
cat /etc/redhat-release
# 1 为了更好的编辑文件可以安装 vim
yum install -y vim
# 2 为了查看端口信息更方便可以安装 lsof
yum install -y lsof
# 3 安装 wget
yum install -y wget
# 4 安装 tree
yum install -y tree
# 5 python 工具
yum install -y python-devel
# 6 安装编译 C 的环境
yum install -y gcc gcc-c++
yum install -y zlib
yum install -y zlib-devel
yum install -y tcl build-essential tk gettext
为了用户登录容器内的 Centos 配置的环境变量都生效,进行如下配置
vim ~/.bashrc
# 在最后添加
source /etc/profile
# 1 yum 安装 spenssl 服务
yum -y install passwd openssl openssh-server openssh-clients
mkdir /var/run/sshd/
# 2 修改配置
vim /etc/ssh/sshd_config +39
## 大概在 38 - 45 行之间,修改或添加如下三个配置
PermitRootLogin yes
RSAAuthentication yes
PubkeyAuthentication yes
# 3 sshd 服务的启停
## 3.1 启动
systemctl start sshd.service
## 3.2 查看 sshd 服务状态
systemctl status sshd
## 3.3 停止
systemctl start sshd.service
# 4 设置为开机自启
systemctl enable sshd.service
# 【可跳过】5 生成ssh的密钥和公钥
# ssh-keygen -t rsa
# 6 查看 SSH 服务
lsof -i:22
# 7 设置 root 密码(2020)
passwd
# 8 通过 ssh 访问容器
ssh root@bigdata
当我们的容器运行过程中需要修改一些配置信息,并生效到容器时,可以按照如下两种方式操作,第一种方法操作简单,但是需要重启整个 Docker 服务,对应某些配置可能还无法生效;第二种方法是推荐的,直接在已有的容器下生成一个新的镜像,以新镜像重启容器,不会对已有容器产生任何影响。
# 其中 hash_of_the_container 可以通过查看 CONTAINER ID 获取
vim /var/lib/docker/containers/${hash_of_the_container}/hostconfig.json
打开后这个是一个压缩后的 json 文件,格式化可以看到 PortBindings
,其中 HostPort
对应的是映射到宿主机的端口,22/tcp
对应的是容器内部的 22 端口,修改完后重启容器 systemctl restart docker
,然后将容器启动 docker start $CONTAINER_ID
,缺点就是每次改动Docker 服务要重启,容器也需要重启。
"NetworkMode": "default",
"PortBindings": {
"22/tcp": [
{
"HostIp": "bigdata01",
"HostPort": "30022"
}
],
"80/tcp": [
{
"HostIp": "bigdata01",
"HostPort": "30080"
}
],
"3306/tcp": [
{
"HostIp": "bigdata01",
"HostPort": "33306"
}
]
}
推荐方式。docker commit
把一个容器的文件改动和配置信息 commit 到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。
# 1 停止当前运行的容器
docker stop $CONTAINER_ID
# 2 commit 该 docker 容器
docker commit $CONTAINER_ID new_image:tag
# 3 查看当前的镜像库
docker images
# 4 用生成的新镜像重新起一个容器
docker run --privileged=true --cap-add SYS_ADMIN -e container=docker -it \
-p 30022:22 -p 30080:80 -p 33306:3306 \
--name="yore_centos7_v2" -h "bigdata01" -d yore/centos7_v2:latest /usr/sbin/init
# 1 停止当前运行的容器
docker stop $CONTAINER_ID
# 2 commit 该 docker 容器
docker commit $CONTAINER_ID centos7_base:v1
# 3 查看当前的镜像库
docker images
# 查看本地已有的镜像
docker images
# 2 访问凭证(前面设置的访问凭证的固定密码 )
sudo docker login --username=7910*****@qq.com registry.cn-shanghai.aliyuncs.com
# 3 tag
docker tag $IMAGE_ID registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003_v1
# 4 push到阿里云镜像
docker push registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003_v1
# 5 如果前面 tag 的镜像需要删除,执行如下命令
docker rmi $REPOSITORY:$TAG
上一步提交成功后,在阿里云控制台页面可以看到如下我们提交的镜像
本镜像基于 Centos 7.8.2003,主要安装了 vim、lsof、wget、tree、sshd 等服务。注意:启动后 root 用户的默认密码为 2020,为了使系统更加安全,请先修改为更加复杂的密码。
# 查看当前 Docker 中有的镜像
sudo docker images
# 拉取上传的镜像
## 镜像连接可以通过 基本信息 查看,有公网地址、专有网络、经典网络可选
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003_v1
将开发中常用到的环境进行安装和配置
# 1 运行。下面会对本容器做进一步的修改设置
# 以 base 镜像为准,启动容器
docker run --privileged=true --cap-add SYS_ADMIN -e container=docker -it \
-p 30022:22 -p 30080:80 -h "bigdata01" \
--name="centos7_dev1" -d centos7_base:v1 /usr/sbin/init
# 2 进入容器
docker ps
docker exec -it $CONTAINER_ID /bin/bash
# 3 hosts 改为。
172.17.0.3 yore.node1 bigdata01
# 1 下载。如果下面链接失效,则需要登录Oracle的账号,
# 访问 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载 jdk8
wget https://download.oracle.com/otn/java/jdk/8u231-b11/5b13a193868b4bf28bcb45c792fce896/jdk-8u231-linux-x64.tar.gz?AuthParam=1573137213_adc79b33f2d9ed27cb8b09b6adf71820
# 2 解压
tar -zxf jdk-8u231-linux-x64.tar.gz -C /usr/local/
chown root:root -R /usr/local/jdk1.8.0_231
# 3 配置环境变量
vim /etc/profile
# 添加如下配置
### set java environment
JAVA_HOME=/usr/local/jdk1.8.0_231
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
# 4 并加载生效:
source /etc/profile
# 5 为了使每次进入容器时都生效
vim ~/.bashrc
# 最后一行添加,保存
source /etc/profile
# 6 查看Java版本
java -version
# 1 下载源码方式,
wget -O git-2.27.0.tar.gz https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.27.0.tar.gz
# 2 解压
tar -zxf git-2.27.0.tar.gz -C /tmp/
cd /tmp/git-2.27.0
# 3 检验相关依赖,设置安装路径
./configure --prefix=/usr/local/git
# 4 安装
make && make install
# 5 创建软连接
ln -s /usr/local/git/bin/git /usr/bin/git
# 6 查看版本
git -v
# 1 下载
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
# 2 解压
tar -zxf apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 /usr/local/maven3
# 3 修改配置
vim /usr/local/maven3/conf/settings.xml
配置如下内容
<localRepository>/opt/.m2/repolocalRepository>
<mirror>
<id>nexus-aliyunid>
<mirrorOf>*mirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
<mirror>
<id>central-repos1id>
<name>Central Repository 2name>
<url>https://repo1.maven.org/maven2/url>
<mirrorOf>*mirrorOf>
mirror>
继续完成下面的配置
# 4 配置环境变量,
vim /etc/profile
# set Maven environment
export MAVEN_HOME=/usr/local/maven3
export PATH=$PATH:$MAVEN_HOME/bin
# 5 生效
source /etc/profile
# 6 查看版本
mvn -version
# 1 下载 Nginx 离线安装包。以 x86、centos7版本为例
wget http://nginx.org/packages/mainline/centos/7/x86_64/RPMS/nginx-1.17.6-1.el7.ngx.x86_64.rpm
# 2 安装
rpm -ivh nginx-1.17.6-1.el7.ngx.x86_64.rpm
# 3 配置文件
/etc/nginx
# server 服务可以配置到下面路径,以 .conf 结尾,重启或使配置生效
/etc/nginx/conf.d/
# 4 常用命令
## 4.1 启动,应为已经将内部 80端口映射到了宿主机的 30080,所以通过宿主机 ip 和 30080 端口浏览器访问
systemctl start nginx
## 4.2 状态
systemctl status nginx
## 4.3 停止
systemctl stop nginx
## 4.4 重启
systemctl restart nginx
## 4.5 配置重新生效
/usr/sbin/nginx -s reload
# 这里提供的镜像已停止了 Nginx 服务,在需要时请手动启动
# 1 下载
wget https://nodejs.org/dist/v12.18.2/node-v12.18.2-linux-x64.tar.xz
# 2 解压
tar -xf node-v12.18.2-linux-x64.tar.xz
mv node-v12.18.2-linux-x64 /usr/local/nodejs
# 3 创建连接
ln -s /usr/local/nodejs/bin/node /usr/bin/node
ln -s /usr/local/nodejs/bin/npm /usr/bin/npm
# 4 查看版本
node -v
npm -v
# 1 停止当前运行的容器
docker stop $CONTAINER_ID
# 2 commit 该 docker 容器
docker commit $CONTAINER_ID centos7_dev:v1
# 3 查看当前的镜像库
docker images
同 3.7 镜像提交到阿里云镜像库 步骤提交到阿里云镜像库中
docker tag $IMAGE_ID registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003-dev_v1
docker push registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003-dev_v1
本镜像基于 Centos 7,在中文基础版上,又集成了 JDK 、Git、Maven、Nginx、Node.js 服务。注意:启动后 root 用户的默认密码为 2020,为了使系统更加安全,请先修改为更加复杂的密码。
# 查看当前 Docker 中有的镜像
sudo docker images
# 拉取上传的镜像
## 镜像连接可以通过 基本信息 查看,有公网地址、专有网络、经典网络可选
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:7.8.2003-dev_v1
这里在开发环境版的镜像基础上安装 MySQL 数据库
# 1 查看存在的网络(默认会创建三个)
# bridge 桥接网络。每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启后 IP 地址可能会改变
# host 主机网络。Docker 容器的网络会附属在主机上,两者是互通的。
# none 容器就不会分配局域网的IP
[yore@VM_0_3_centos app]$ sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
ba8077c371b9 bridge bridge local
1be5b2b64e10 host host local
77ef163ae7c4 none null local
# 2 创建自定义的网络。
# sudo docker network prune
# 注意:不能和已有的网段冲突
sudo docker network create --subnet=172.19.0.0/16 mynetwork
# 1 运行。下面会对本容器做进一步的修改设置
# 以 centos7_dev 镜像为准,启动容器
# network 网络方式指定为前面自定义的 mynetwork,这样我们可以直接指定 ip
docker run --privileged=true --cap-add SYS_ADMIN -e container=docker -it \
--network mynetwork --ip 172.19.0.2 -h "bigdata02" --name="dev_mysql_v1" \
-p 30022:22 -p 33306:3306 \
-d centos7_dev:v1 /usr/sbin/init
# 2 进入容器
docker ps
docker exec -it $CONTAINER_ID /bin/bash
# 3 【可选】hosts 改为。也可以在 run 时指定
172.19.0.2 yore.node2 bigdata02
MySQL 安装详见我的 blog CDH 6.2.0 或 6.3.0 安装实战及官方文档资料链接#1.5 MySQL 内容。
• 系统中 mysql 用户的默认密码为 mysql。安全起见,在公网下请修改为密码强度更大的密码
• MySQL 默认开启了 binlog。可以在配置文件中关闭掉。
• 当报 error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory
,执行 yum -y install numactl.x86_64
。
• MySQL 数据库管理员账号 root 的密码默认为 123456。可以自行修改为密码强度更大的密码。
• 默认情况下,远程连接:mysql -h 宿主机ip -P 33306 -uroot -p
。
# 1 停止当前运行的容器
# docker stop $CONTAINER_ID
# 2 commit 该 docker 容器
docker commit $CONTAINER_ID dev_mysql:v1
# 3 查看当前的镜像库
docker images
同 3.7 镜像提交到阿里云镜像库 步骤提交到阿里云镜像库中。
docker tag $IMAGE_ID registry.cn-shanghai.aliyuncs.com/yore/bigdata:dev-mysql_v1
docker push registry.cn-shanghai.aliyuncs.com/yore/bigdata:dev-mysql_v1
本镜像基于 Centos 7,在开发环境版的基础上,又集成了 MySQL 5.7 服务。注意:启动后 系统 root 用户的默认密码为 2020,为了使系统更加安全,请先修改为更加复杂的密码。
# 查看当前 Docker 中有的镜像
sudo docker images
# 拉取上传的镜像
## 镜像连接可以通过 基本信息 查看,有公网地址、专有网络、经典网络可选
sudo docker pull registry.cn-shanghai.aliyuncs.com/yore/bigdata:dev-mysql_v1