Ubuntu-host-docker-CentOS7-testRecord

Ubuntu安装Docker

dirmngr - GNU privacy guard - network certificate management service

遇到docker宿主机dirmngr进程CPU占用一直在99.7%问题,原因待核实:
root        1934 99.7  0.8 248068 16780 ?        Rsl  Oct26 1737:51 dirmngr --homedir /tmp/apt-key-gpghome.n8aiXjw6RP --daemon

kill无效,只能kill -9,reboot后无该进程,可能是之前做系统配置、添加国内源操作时产生的。

安装Docker

自建CentOS7.9镜像

试了各种配置方式docker pull都没能成功,我手上也没有现成的http_proxy。

我只是需要一个centos7.9的镜像来做环境测试。

github CentOS 7.9.2009 images https://github.com/CentOS/sig-cloud-instance-images

下载了CentOS 7.9.2009 images的Dockerfile和tar文件,用docker build创建一个,2分钟就能搞定:

#
# MAINTAINER        XStar <154725@qq.com>
# DOCKER-VERSION    27.3.1, build ce12230
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#

# 构建Docker镜像必须要有一个基础镜像,即父镜像(可从官网pull也可自己制作)
FROM       xstar/centos:7.9.2009
# 指定维护者信息
MAINTAINER XStar <154725@qq.com>

# 设置时区环境变量(ENV环境变量在Dockerfile中可以写多个)
# 这些指定的环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量
ENV TZ "Asia/Shanghai"
ENV TERM xterm

# ADD:添加/拷贝文件到container里面,还有一个拷贝命令是COPY
# 两者的区别如下:
# 前者比后者多两个功能;
#     1. 可直接将url对应的文件直接复制到container里面;
#     2. 如果复制的是tar压缩包文件,用ADD拷贝结束后会自动帮我们解压;
COPY CentOS-Base-Aliyun.repo /etc/yum.repos.d/CentOS-Base.repo

# RUN 后面是要执行的命令,每执行一条指令就是一层,所以Dockerfile采用的是分层的技术
RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
    yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
    yum install -y --enablerepo=epel pwgen python-pip && \
    yum clean all

RUN pip install supervisor  # 安装进程管理工具
ADD supervisord.conf /etc/supervisord.conf  # 添加进程管理工具的主配置文件到指定目录下,一般是/etc目录

RUN mkdir -p /etc/supervisor.conf.d && \    # 为进程管理工具新建一个目录,用来存放启动其他服务的配置文件
    mkdir -p /var/log/supervisor            # 新建进程管理日志目录

EXPOSE 22   # Docker服务器开放的端口,供容器外部连接使用(在启动容器时做端口映射)

# 如果有多条ENTRYPOINT语句,那么只有最后一条生效
# ENTRYPOINT指的是container每次启动的时候需要执行的命令
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
#
# MAINTAINER        Nick,Y.Peng <nickyp@dockerstu.com>
# DOCKER-VERSION    1.6.2
#
# Dockerizing CentOS7: Dockerfile for building CentOS images
#

# 构建Docker镜像必须要有一个基础镜像,即父镜像(可从官网pull也可自己制作)
FROM       centos:centos7.1.1503
# 指定维护者信息
MAINTAINER Nick,Y.Peng <nickyp@dockerstu.com>

# 设置时区环境变量(ENV环境变量在Dockerfile中可以写多个)
# 这些指定的环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量
ENV TZ "Asia/Shanghai"
ENV TERM xterm

# ADD:添加/拷贝文件到container里面,还有一个拷贝命令是COPY
# 两者的区别如下:
# 前者比后者多两个功能;
#     1. 可直接将url对应的文件直接复制到container里面;
#     2. 如果复制的是tar压缩包文件,用ADD拷贝结束后会自动帮我们解压;
ADD aliyun-mirror.repo /etc/yum.repos.d/CentOS-Base.repo
ADD aliyun-epel.repo /etc/yum.repos.d/epel.repo

# RUN 后面是要执行的命令,每执行一条指令就是一层,所以Dockerfile采用的是分层的技术
RUN yum install -y curl wget tar bzip2 unzip vim-enhanced passwd sudo yum-utils hostname net-tools rsync man && \
    yum install -y gcc gcc-c++ git make automake cmake patch logrotate python-devel libpng-devel libjpeg-devel && \
    yum install -y --enablerepo=epel pwgen python-pip && \
    yum clean all

RUN pip install supervisor  # 安装进程管理工具
ADD supervisord.conf /etc/supervisord.conf  # 添加进程管理工具的主配置文件到指定目录下,一般是/etc目录

RUN mkdir -p /etc/supervisor.conf.d && \    # 为进程管理工具新建一个目录,用来存放启动其他服务的配置文件
    mkdir -p /var/log/supervisor            # 新建进程管理日志目录

EXPOSE 22   # Docker服务器开放的端口,供容器外部连接使用(在启动容器时做端口映射)

# 如果有多条ENTRYPOINT语句,那么只有最后一条生效
# ENTRYPOINT指的是container每次启动的时候需要执行的命令
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
# 交互运行容器,-i:允许标准stdin交互,-t: tty终端
docker run --rm -it xstar/centos:7.9.2009 /bin/bash
# 后台运行容器
docker run --rm -d --name centosbase xstar/centos:7.9.2009 /bin/sh -c "while true; do echo hello world; sleep 1; done"

docker exec -it centosbase /bin/bash # 进入容器shell环境
docker attach centosbase  # 附着到容器标准stdin/stdout控制台,若中止控制台在运行的命令,容器会关闭
docker cp centos:/etc/resolv.conf ./ # 从容器复制配置文件到本地

# 查看容顺的标准输出stdout
docker logs centosbase

# 停止容器
docker stop centosbase

CentOS容器内安装环境

基础系统

# 设置国内源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache

# 系统更新
yum check-update && yum update

# 设置时区
# 应该在Dockerfile或run进用ENV参数传入: -e TZ=Asia/Shanghai
# Failed to create bus connection错误是因为没有权限访问host的/run/dbus/system_bus_socket,可在docker run时用-v挂载进容器
# -v /run/dbus/system_bus_socket:/run/dbus/system_bus_socket:ro
# timedatectl set-timezone Asia/Shanghai
# 在docker容器中添加同样的用户,宿主机、容器用户ID保持一致,以便文件权限设置。

groupadd --gid 2000 hcty
useradd -c "game master" --gid 2000 --uid 2000 --shell /bin/bash -m hcty

用容器生成镜像

docker commit: Create a new image from a container's changes

docker save:   Save one or more images to a tar archive (streamed to STDOUT by default),会保存该镜像的所有历史记录。
docker load:   Load an image from a tar archive or STDIN。用于载入镜像包为image,不能重命包镜像。

docker export: Export a container's filesystem as a tar archive,不会保留commit历史记录。
docker import: Import the contents from a tarball to create a filesystem image,用来载入容器包为image,可以重命名镜像。

容器中安装业务运行环境

挂载宿主目录

--volume(-v)
参数--volume(或简写为-v)只能创建bind mount。

命令格式:[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]
如果指定HOST-DIR则必须是绝对路径,如果路径不存在则会自动创建
OPTIONS:rw为读写,ro为只读
docker run --name $CONTAINER_NAME -it \
-v $PWD/$CONTAINER_NAME/app:/app:rw \
-v $PWD/$CONTAINER_NAME/data:/data:ro \
avocado-cloud:latest /bin/bash

--mount
参数--mount默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。
如果不指定type选项,则默认为挂载volume,volume是一种更为灵活的数据管理方式,volume可以通过docker volume命令集被管理。

挂载volume命令格式:    [type=volume,]source=my-volume,destination=/path/in/container[,...]
创建bind mount命令格式:type=bind,source=/path/on/host,destination=/path/in/container[,...]
如果创建bind mount并指定source则必须是绝对路径,且路径必须已经存在

docker run --name $CONTAINER_NAME -it \
--mount type=bind,source=$PWD/$CONTAINER_NAME/app,destination=/app \
--mount source=${CONTAINER_NAME}-data,destination=/data,readonly \
avocado-cloud:latest /bin/bash
对比项 bind mount volume
Source位置 用户指定 /var/lib/docker/volumes/
Source为空 覆盖dest为空 保留dest内容
Source非空 覆盖dest内容 覆盖dest内容
Source种类 文件或目录 只能是目录
可移植性 一般(自行维护) 强(docker托管)
宿主直接访问 容易(仅需chown) 受限(需登陆root用户)*

安装gcc

yum -y install gcc automake autoconf libtool make

Hiredis

Hiredis是一个Redis的C客户端库函数,基本实现了Redis的协议的最小集。

发行版本:https://github.com/redis/hiredis/releases

安装第三方库

mysql-client

lua

yum install readline-devel -y

cd /usr/local/src \
&& tar zxvf /data/soft/lua-5.2.4.tar.gz \
&& cd lua-5.2.4 \
&& make linux \
&& make install

tinyxml

yum -y update gcc
yum -y install gcc+ gcc-c++

cd /usr/local/src \
&& unzip /data/soft/tinyxml_2_6_2.zip \
&& cd tinyxml

MakeFile修改:

# 修改1
OUTPUT := xmltest
改为:
OUTPUT := libtinyxml.a

# 修改2
SRCS := tinyxml.cpp tinyxmlparser.cpp xmltest.cpp tinyxmlerror.cpp tinystr.cpp
删除:xmltest.cpp

#修改3
注释行:xmltest.o: tinyxml.h tinystr.h

# 修改4,注意与原来的行保持一致的TAB缩进,否则编译会报错
${LD} -o $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}
修改为:
${AR} $@ ${LDFLAGS} ${OBJS} ${LIBS} ${EXTRA_LIBS}
make \
&& cp libtinyxml.a /usr/lib \
&& cp ./tinyxml.h /usr/local/include/ \
&& cp ./tinystr.h /usr/local/include/ \
&& ll /usr/local/include/tiny*

openssl

cd /usr/local/src \
&& rm -rf openssl-1.0.2d \
&& tar -zxvf /data/soft/openssl-1.0.2d.tar.gz \
&& cd openssl-1.0.2d \
&& ./config --prefix=/usr/local --openssldir=/usr/local/openssl no-shared \
&& make \
&& make install_sw \
&& ln -s /usr/local/lib64/libssl.a /usr/local/lib/libssl.a \
&& ln -s /usr/local/lib64/libcrypto.a  /usr/local/lib/libcrypto.a \
&& echo Done.

libevent

cd /usr/local/src \
&& tar -zxvf /data/soft/libevent-2.0.22-stable.tar.gz \
&& cd libevent-2.0.22-stable \
&& ./configure \
&& make \
&& make install \
&& echo Done.

其它第三方库

yum -y install libuuid-devel libcurl-devel boost-devel mysql-devel
# yum -y --skip-broken install mysql-devel

安装中心服务库

安装FastCGI支持(Only Center)

安装gcc 4.9.4

安装游戏服务支包

chroot运行服务