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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容