一、docker下载
***推荐方式***
#更新最新的软件包
yum update
#安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
#安装docker-yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看docker版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本
yum install docker-ce-18.06.3.ce
#启动docker
systemctl start docker
***其他方式***
yum -y install docker
查看docker版本
docker version
启动docker服务
docker service start
查看本地镜像
docker images
如果没有本地镜像,可以下载一个centos7的镜像来作为基础运行环境
docker pull centos
再次查看本地镜像
docker images
安装 docker-compose
yum -y install -y epel-release #安装pip需要先安装epel-release包
yum install -y python-pip #安装pip
pip install --upgrade pip #升级pip
pip install docker-compose #安装docker-compose
docker-compose -v #查看docker-compose的版本
第二种方式安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.28.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version
第三种方式安装
下载对应的版本
https://github.com/docker/compose/releases
然后把文件传到该文件夹下/usr/local/bin/
# 添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 将文件copy到 /usr/bin/目录下
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# 查看版本
docker-compose --version
二、centos镜像下载
#下载稳定版本centos镜像
docker pull centos
三、基础操作
进入镜像centos进行相关操作
docker run -it centos /bin/bash
安装软件
yum install vim*
备注:此时需要记住此时的容器ID
退出容器
exit
保存镜像--就像git操作一样
docker commit -m "Added vim_" -a "Docker Newbee" 92896fb7e091 centos
//其中:
-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;
-a 可以指定更新的用户信息;
92896fb7e091 是用来创建镜像的容器的 ID;
centos_vim_lrzsz是指定目标镜像的仓库名(centos_vim_lrzsz)
创建成功后会返回新镜像的 ID:
再次进入新容器进行相关操作
docker run -i -t -v /home/huzhihui/huzhihui:/home/huzhihui 89796a /bin/bash
//其中:
-i 表示以"交互模式"运行容器
-t 表示容器启动后会进入其命令行
-v 表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机绝对目录>:<容器绝对目录>
89796a 即2中新容器的ID,也可以用"容器名:TAG"唯一即可
/bin/bash 即进入容器后的bash shell命令行对应-t
一切就绪,开始运行tomcat服务
docker run -d -p 58080:8080 -v /home/huzhihui/:/home/huzhihui/ --name test_tomcat_1 test_tomcat:1.0 /root/run.sh
//其中:
-v 略,如前所述说
-d 表示以"守护模式"执行/root/run.sh脚本,此时 Tomcat 控制台不会出现在输出终端上
-p 表示宿主机与容器的端口映射,此时将容器内部的8080端口映射为宿主机的58080端口,这样就向外界暴露了58080端口,可通过Docker网桥来访问容器内部的8080端口了
--name 表示容器名称,用一个你觉得有意义的名称命名即可
test_tomcat:1.0 即新容器名:TAG
/root/run.sh 即需要执行的脚本
当然你可能会问容器中的tomcat正常启动了吗?日志怎么看?
docker logs e25a7d9f4506
进去启动的docker容器
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
给镜像设置tag
docker tag huzhihui/frps huzhihui/frps:0.28
上传镜像到docker hub
docker push huzhihui/frps:1.0
查看docker容器与宿主机器共享的文件夹命令
docker inspect sms | grep Mounts -A 20 #sms是容器的名称
查看docker容器与书主机映射的端口
docker container port sms #sms是容器名称
如果防火墙是iptables则运行
1.iptables -nL -t nat 查看nat规则是否存在
2.iptables-save 检查当前 IPTable 表是否空
3.如果IPtable 表不为空。 先备份IPtable表
cp /etc/sysconfig/iptables /etc/sysconfig/iptables_bak_1
4.iptables-save > /etc/sysconfig/iptables 将所有IPtable 规则重新保存
这时候,重启防火墙也不会影响 容器使用了
五、第一个Dockerfile
FROM centos
MAINTAINER huzhihui_c@qq.com
WORKDIR /usr/local
RUN mkdir jdk
RUN mkdir tomcat
ADD jdk1.8 /usr/local/jdk/
ADD tomcat8.5 /usr/local/tomcat/
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
#保存后执行
docker build -t huzhihui/tomcat .
#运行镜像
docker run -d -p 8080:8080 --name hmk_tomcat huzhihui/tomcat:latest
生产环境Dockerfile
#创建Dockerfile文件,写入如下内容
FROM centos:7
MAINTAINER huzhihui_c@qq.com
ENV LANG=en_US.UTF-8
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
WORKDIR /usr/local
RUN mkdir jdk
RUN mkdir tomcat
ADD jdk1.8 /usr/local/jdk/
ADD tomcat8.5 /usr/local/tomcat/
ADD run.sh /root
RUN ln -sf /dev/stdout /usr/local/tomcat/logs/catalina.out
ENV JAVA_HOME=/usr/local/jdk
ENV JRE_HOME=$JAVA_HOME/jre
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH=/sbin:$JAVA_HOME/bin:$PATH
EXPOSE 8080
EXPOSE 8500
ENTRYPOINT ["/root/run.sh"]
#该文件夹下面存在jdk1.8、tomcat8.5以及run.sh文件
#run.sh文件就是你想如何运行你的容器
#!/bin/sh
#如果APP文件夹不存在,则复制默认的APP文件夹过去
if [[ ! -d "/usr/local/tomcat/webapps/app/" ]] ; then
cp -rf /usr/local/tomcat/webapps_back/app/ /usr/local/tomcat/webapps/app/
fi
if [[ ! -d "/usr/local/tomcat/webapps/docs/" ]] ; then
cp -rf /usr/local/tomcat/webapps_back/docs/ /usr/local/tomcat/webapps/docs/
fi
if [[ ! -d "/usr/local/tomcat/webapps/examples/" ]] ; then
cp -rf /usr/local/tomcat/webapps_back/examples/ /usr/local/tomcat/webapps/examples/
fi
if [[ ! -d "/usr/local/tomcat/webapps/host-manager/" ]] ; then
cp -rf /usr/local/tomcat/webapps_back/host-manager/ /usr/local/tomcat/webapps/host-manager/
fi
if [[ ! -d "/usr/local/tomcat/webapps/manager/" ]] ; then
cp -rf /usr/local/tomcat/webapps_back/manager/ /usr/local/tomcat/webapps/manager/
fi
bash /usr/local/tomcat/bin/startup.sh
tail -f /usr/local/tomcat/logs/catalina.out
#然后执行下面命令即可
docker build huzhihui/tomcat:8.5 .
六、开放dockerAPI并TLS加密
#docker开启 api TLS
#我们利用脚本自动生成,这样非常便捷,脚本(auto-tls-certs.sh)如下:
#!/bin/bash
#
# -------------------------------------------------------------
# 自动创建 Docker TLS 证书
# -------------------------------------------------------------
# 以下是配置信息
# --[BEGIN]------------------------------
CODE="dp"
IP="docker服务器ip"
PASSWORD="证书密码"
COUNTRY="CN"
STATE="BEIJING"
CITY="BEIJING"
ORGANIZATION="公司"
ORGANIZATIONAL_UNIT="Dev"
COMMON_NAME="$IP"
EMAIL="邮箱"
# --[END]--
# Generate CA key
openssl genrsa -aes256 -passout "pass:$PASSWORD" -out "ca-key-$CODE.pem" 4096
# Generate CA
openssl req -new -x509 -days 365 -key "ca-key-$CODE.pem" -sha256 -out "ca-$CODE.pem" -passin "pass:$PASSWORD" -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL"
# Generate Server key
openssl genrsa -out "server-key-$CODE.pem" 4096
# Generate Server Certs.
openssl req -subj "/CN=$COMMON_NAME" -sha256 -new -key "server-key-$CODE.pem" -out server.csr
echo "subjectAltName = IP:$IP,IP:127.0.0.1" >> extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "server-cert-$CODE.pem" -extfile extfile.cnf
# Generate Client Certs.
rm -f extfile.cnf
openssl genrsa -out "key-$CODE.pem" 4096
openssl req -subj '/CN=client' -new -key "key-$CODE.pem" -out client.csr
echo extendedKeyUsage = clientAuth >> extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -passin "pass:$PASSWORD" -CA "ca-$CODE.pem" -CAkey "ca-key-$CODE.pem" -CAcreateserial -out "cert-$CODE.pem" -extfile extfile.cnf
rm -vf client.csr server.csr
chmod -v 0400 "ca-key-$CODE.pem" "key-$CODE.pem" "server-key-$CODE.pem"
chmod -v 0444 "ca-$CODE.pem" "server-cert-$CODE.pem" "cert-$CODE.pem"
# 打包客户端证书
mkdir -p "tls-client-certs-$CODE"
cp -f "ca-$CODE.pem" "cert-$CODE.pem" "key-$CODE.pem" "tls-client-certs-$CODE/"
cd "tls-client-certs-$CODE"
tar zcf "tls-client-certs-$CODE.tar.gz" *
mv "tls-client-certs-$CODE.tar.gz" ../
cd ..
rm -rf "tls-client-certs-$CODE"
# 拷贝服务端证书
mkdir -p /etc/docker/certs.d
cp "ca-$CODE.pem" "server-cert-$CODE.pem" "server-key-$CODE.pem" /etc/docker/certs.d/
对脚本中的变量进行修改后运行,自动会创建好tls证书,服务器的证书在/etc/docker/certs.d/目录下:
客户端的证书在运行脚本的目录下,同时还自动打好了一个.tar.gz的包,很方便。
#配置dockerdaemon配置
cat /etc/docker/daemon.json
{
"hosts": ["tcp://0.0.0.0:2375","unix:///var/run/docker.sock"],
"tlsverify":true,
"tlscacert":"/root/tls/pem/ca.pem",
"tlscert":"/root/tls/pem/server-cert.pem",
"tlskey":"/root/tls/pem/server-key.pem"
}
#并且编辑vim /lib/systemd/system/docker.service
#下面这行 -H fd:// 一定要去掉,不然会和daemon.json配置冲突
ExecStart=/usr/bin/dockerd
#然后重启docker api已经有了认证了
七、portainer工具管理docker
# docker-compose.yml
version: '3'
volumes:
portainer_data:
services:
portainer:
image: portainer/portainer
container_name: portainer
ports:
- "9000:9000"
command: -H unix:///var/run/docker.sock
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data