当前位置: 首页>后端>正文

CentOS Docker基本操作

一、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

https://www.xamrdz.com/backend/3we1995001.html

相关文章: