Docker ip:172.16.3.17 Docker 配置清华大学的docker镜像源 以下内容根据 官方文档 修改而来。 如果原来安装过docker-ce需要先移除 yum remove docker docker-common docker-selinux docker-engine 安装一些依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 根据你的发行版下载repo文件: wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo 把软件仓库地址替换为清华大学国内的镜像源: sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo 利yum安装docker yum makecache fast yum install docker-ce 启动docker systemctl start docker.service 设置为开机自启动 systemctl enable docker.service 查看docker版本 docker version 返回结果: Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:27:04 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:25:42 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683 查看docker系统信息 docker info 返回结果 Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.8 Storage Driver: overlay2 Backing Filesystem: <unknown> Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 8 Total Memory: 7.795GiB Name: localhost.localdomain ID: Q2PR:QCIS:GBPN:YFIT:OX4I:57DH:4GT2:JYKL:E7F6:MBO2:FPRU:D3HC Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Live Restore Enabled: false WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabled 编辑docker的配置文件,启用国内的加速借点 vim /etc/docker/daemon.json { "registry-mirrors": ["https://e9yneuy4.mirror.aliyuncs.com"] } 或者用国内的 { "registry-mirrors": ["http://hub-mirror.c.163.com","http://hub-mirror.c.163.com","https://registry.docker-cn.com"] } 修改好以后,重启docker systemctl restart docker.service docker容器常用命令 搜索nginx容器镜像 docker search nginx 解释: docker search 搜索docker容器镜像后面加上容器的名称即可 下载一个nginx容器镜像,默认下载它会下载最新的镜像 docker pull nginx 再来下载一个alpine镜像,最轻量的linux发行版 docker pull alpine 返回结果: Using default tag: latest latest: Pulling from library/alpine cbdbe7a5bc2a: Pull complete Digest: sha256:9a839e63dad54c3a6d1834e29692c8492d93f90c59c978c1ed79109ea4fb9a54 Status: Downloaded newer image for alpine:latest docker.io/library/alpine:latest 下载非官方的docker容器镜像,下载一个163的tomcat docker pull hub.c.163.com/library/tomcat:latest 查看当前都有哪些docker容器 docker image ls 返回结果 REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6a266 2 weeks ago 5.61MB nginx latest 602e111c06b6 2 weeks ago 127MB hub.c.163.com/library/tomcat latest 72d2be374029 2 years ago 292MB 删除一个镜像,可以后面跟名字或者跟ID都可以 docker image rm hub.c.163.com/library/tomcat 导出一个现有的alpine容器镜像,并且打成一个docker_alpine.tar.gz包,把镜像存到/opt/目录下 docker image save -o /opt/docker_alpine.tar.gz alpine:latest 或者 docker image save alpine:latest > docker_alpine.tar.gz 解释: docker image save 导出镜像命令 -o 导出到指定的路径下 删除现有的alpine镜像,并再把刚才导出的镜像,导入进来 先删除 docker image rm alpine:latest 再倒入现有的alpine docker image load -i /opt/docker_alpine.tar.gz 解释: docker image load 导入镜像命令 -i 指定导入镜像存放的位置 再来查看现有的镜像 docker image ls 返回结果 REPOSITORY TAG IMAGE ID CREATED SIZE alpine latest f70734b6a266 2 weeks ago 5.61MB nginx latest 602e111c06b6 2 weeks ago 127MB 容器常用操作 运行一个nginx的docker容器,如果本地没有这个镜像它会去网上下载这个镜像 docker run -d -p 80:80 nginx 返回结果: 解释: docker run 启动容器 -d 后台运行 -p 端口映射,指定docker容器内部端口和宿主机的外部端口 80:80 外部端口和内部端口 nginx 容器名称 启动好以后,可以用浏览打开172.16.3.17,访问一下,可以看到nginx的默认界面 http://172.16.3.17/ 下载一个centos6.9的容器镜像 docker pull centos:6.9 启动centos:6.9并分配一个虚拟终端 [root@localhost ~]# docker run -it centos:6.9 返回结果 [root@52127dea4de7 /]#现在看到这个主机名已经变了 这个时候已经进入到容器内部里,这里所执行的操作都是在centos:6.9中执行的 解释: -it 给docker容器镜像,分配一个虚拟终端,就跟xshell连接你的服务器的原理是一样的 退出容器内部 [root@52127dea4de7 /]# exit 返回结果 exi 查看运行中的容器 [root@localhost ~]# docker container ls 容器运行ID 启动容器的名字 容器初始命令 容器的创建时间 容器的状态 端口映射 名气的名字 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f0a6aee72bf1 nginx "nginx -g 'daemon of…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp frosty_sammet 指定centos:6.9的名称,也就是不用系统自带的随机名称 docker run --name centos6 -d centos:6.9 解释 --name centos6 指定容器镜像的名称 查看所有的容器,包括运行的和死掉的 [root@localhost ~]# docker ps ls -a 返回结果 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ff49ea8deb centos:6.9 "/bin/bash" 4 minutes ago Exited (0) 4 minutes ago centos6 52127dea4de7 centos:6.9 "/bin/bash" 21 minutes ago Exited (127) 14 minutes ago inspiring_easley f0a6aee72bf1 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp frosty_sammet d7ae00b3ce74 nginx "nginx -g 'daemon of…" 3 hours ago Exited (0) 3 hours ago inspiring_matsumot 这里可以看到centos6 查看容器列表 docker ps -a 只显示最近一次运行的一个容器 [root@localhost ~]# docker ps -a -l 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 58ff49ea8deb centos:6.9 "/bin/bash" 6 minutes ago Exited (0) 6 minutes ago centos6 这里我们可以看到,我们手动指定的名称centos6,这样方便后期管理我们的容器 查看运行中的容器 docker ps 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f0a6aee72bf1 nginx "nginx -g 'daemon of…" 3 hours ago Up 3 hours 0.0.0.0:80->80/tcp frosty_sammet 停掉nginx的容器 [root@localhost ~]# docker container stop f0a6aee72bf1 这是容器的ID f0a6aee72bf1 启动刚才停止的容器 [root@localhost ~]# docker container start f0a6aee72bf1 f0a6aee72bf1 启动一个容器,并进入容器中 后台启动nginx并指定centos6.9的名称 docker run --name nginx -itd -p 81:81 nginx:latest 进入nginx容器内部,并指定sh docker exec -it nginx /bin/sh 解释: docker exec -it 给容器分配一个虚拟终端 nginx 容器的ID或者名称都可以 /bin/sh 指定容器的sh,方便容器内运行命令 拷贝宿主机的index.html拷贝到容器中去,也就是拷贝到容器的网站发布目录中去 先来创建一个index.html文件 echo test > index.htl 把index.html拷贝到容器中去 docker cp index.html 8367cc354747:/usr/share/nginx/html/ 在宿主机里查看容器中文件 docker exec 8367cc354747 ls /usr/share/nginx/html 拷贝容器的nginx的默认配置文件到宿主机的/opt目录下 docker cp 8367cc354747:/etc/nginx/nginx.conf /opt 给宿主机配置多个IP地址,这样可以让多个docker都能用80,外部访问无需单独加端口 配置临时IP ifconfig eth0:1 172.16.30.223/24 up ifconfig eth0:2 172.16.30.225/24 up ifconfig eth0:3 172.16.30.227/24 up 多个容器实现同时使用80端口 docker run -itd -p 172.16.30.223:80:80 nginx:latest docker run -itd -p 172.16.30.225:80:80 nginx:latest docker run -itd -p 172.16.30.227:80:80 nginx:latest 实现容器172.16.30.223随机端口启动 dicker run -itd -p 172.16.30.223::80 nginx:latest dicker run -itd -p 172.16.30.223::80 nginx:latest 查看随机的端口是多少 netstat -lntup 返回结果 tcp 0 0 172.16.30.225:80 0.0.0.0:* LISTEN 31375/docker-proxy tcp 0 0 172.16.30.223:80 0.0.0.0:* LISTEN 31253/docker-proxy tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 5902/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5997/master tcp 0 0 172.16.30.223:32768 0.0.0.0:* LISTEN 32309/docker-proxy tcp 0 0 172.16.30.223:32769 0.0.0.0:* LISTEN 32419/docker-proxy tcp6 0 0 :::22 :::* LISTEN 5902/sshd tcp6 0 0 ::1:25 :::* LISTEN 5997/master udp 0 0 127.0.0.1:323 0.0.0.0:* 5560/chronyd udp6 0 0 ::1:323 :::* 5560/chronyd 这里我们可以看到,开始端口是32768,结束的端口60999 tcp 0 0 172.16.30.223:32768 0.0.0.0:* LISTEN 32309/docker-proxy tcp 0 0 172.16.30.223:32769 0.0.0.0:* LISTEN 32419/docker-proxy 默认docker映射的端口是TCP是协议,如果使用UDP需要加上:udp docker run -itd -p 53:53/udp ntpd:latest 如果我们容器中要指定多个端口可以用多个-p docker run -itd -p 80:80 -p 443:443 nginx:latest 使用-P(大P)随机端口 docker run -itd -P nginx:latest 查看容器的Ip地址,命令后面加上容器的CONTAINER ID号 docker inspect a79d49695d00|grep -i ipaddr|tail -1|awk -F\" '{print $4}' 批量启动100台nginx容器命令如下 for i in `seq 0 99`;do docker run -itd -p 80$i:80 nginx ;done 查看100台Nginx容器的IP地址; for i in $(docker ps|awk 'NR>1 {print $1}');do docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done 查看100台Nginx容器的ID和IP地址 for i in $(docker ps|awk 'NR>1 {print $1}');do echo $i; docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done|sed 'N;s/\n/ /g' 查看100台Nginx容器的ID和IP地址,并导出文件 echo "容器ID,容器IP";for i in $(docker ps|awk 'NR>1 {print $1}');do echo $i; docker inspect $i|grep -i ipaddr|tail -1|awk -F\" '{print $4}' ;done|sed 'N;s/\n/ /g'|sed 's/ /,/g' >>docker_list.csv 手动创建新的容器 首先下载一个容器 docker pull ansible/centos7-ansible 启动容器,并映射nginx80:80 docker run -itd -p 80:80 ansible/centos7-ansible 查看容器的ID docker ps -a 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 055a95db ansible/centos7-ansible "/bin/bash" 30 minutes ago Up 30 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:6022->22/tcp goofy_swirles 进入这台容器安装nginx docker exec -it 1357055a95db /bin/bash 进入容器以后编译安装nginx,先来安装所需要的依赖包 yum install lrzsz gcc make pcre-devel openssl-devel 下载nginx wget http://nginx.org/download/nginx-1.18.0.tar.gz 解压nginx tar xf nginx-1.18.0.tar.gz 进入nginx目录 nginx-1.18.0/ 添加编译参数 ./configure --prefix=/usr/local/nginx 编译 make 安装 make install 启动 /usr/local/nginx/sbin/nginx 退出容器 esxi 生成新的容器,新的容器的名字叫centos7-nginx docker commit 1357055a95db centos7-nginx 查看现有的容器 docker image ls 返回结果: REPOSITORY TAG IMAGE ID CREATED SIZE centos7-nginx latest f3027f2c13d2 11 minutes ago 709MB ansible/centos7-ansible latest 688353a31fde 4 years ago 447MB 导出刚才手动创建的容器,导出到/opt/目录下 docker save -o /opt/centos7-nginx.tar.gz f3027f2c13d2 利用dockerfile一键部署docker容器 首先创建一个专门存放dockerfile文件的目录 mkdir -p /data 进入目录 cd /data 编译一个dockerfile文件 vim Dockerfile 写入以下内容 FROM ansible/centos7-ansible MAINTAINER www.9527edu.org RUN rm -rf /etc/yum.repos.d/epel* RUN echo 123456|passwd --stdin root RUN yum install net-tools openssh-server -y CMD /bin/bash 解释: FROM ansible/centos7-ansible FROM指定所创建镜像的基础镜像,这里我指定的是ansible/centos7-ansible这个docker镜像 MAINTAINER www.9527edu.org 指定维护者信息; RUN rm -rf /etc/yum.repos.d/epel* 在容器中执行命令rm -rf /etc/yum.repos.d/epel* RUN echo 123456|passwd --stdin root 在容器中执行命令echo 123456|passwd --stdin root RUN yum install net-tools openssh-server -y 在容器中执行命令yum install net-tools openssh-server -y Docker数据卷 把宿主机的某个文件夹下载的文件拷贝到容器中去,首先先来启动一台nginx容器 启动一套虚拟机 docker run -itd -p 80:80 nginx:latest 准备一个html的小网站,自己生成一个就行了 echo "text web server" > /opt/index.html 把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下 先来查看容器的ID docker ps -a 返回结果: CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0102dd74e458 nginx:latest "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp sad_rhodes 把宿主机下的/opt/index.html拷贝到容器的/usr/share/nginx/html/下 docker container cp /opt/index.html 0102dd74e458:/usr/share/nginx/html 用宿主机curl一下 curl 172.16.30.220 返回结果 text web server 映射一个宿主机的本地的目录到容器中,这样直接修改本地的数据文件,就可以直接修改容器中的数据库文件,不需要单独进入容器中去修改 先来创建一个目录 mkdir -p /data 关闭所有允许中的容器 docker rm -f `docker ps -a -q` 映射/data/到容器的/usr/share/nginx/html docker run -itd -p 80:80 -v /data:/usr/share/nginx/html nginx:latest -v 映射卷,映射磁盘目录 docker卷命令 docker volume create inspect 查看卷详细信息 ls prune rm docker映射一个text卷到容器中,如果系统中没有这个卷系统会自动创建 两个docker容器可以同时挂载一个卷,这样两个容器的内容就一模一样了 如果卷里面有东西会把,卷里面的内容映射到容器中去 如果卷里面没有东西会把容器中的内容放到卷里面 docker run -itd -p 80:80 -v text:/usr/share/nginx/html/ nginx:latest -v 卷名:容器目录 查看卷的详细信息 docker volume inspect test 返回结果 [ { "CreatedAt": "2020-07-31T09:01:57+08:00",创建的时间 "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/text/_data",卷存档的目录,后期修改内容可以直接进入这个目录里做修改就行了 "Name": "text",卷的名称 "Options": null, "Scope": "local" } ] 查看/var/lib/docker/volumes/text/_data目录 ls /var/lib/docker/volumes/text/_data 返回结果 50x.html index.html 可以看到这是默认的nginx访问页面文件 总结:docker容器内的第一个进程(初始命令)必须一直处于前台运行的状态(必须夯筑),否则这个容器就会处于退出的状态 业务在容器中运行:夯筑,启动服务 比如: docker run -itd centos:latest 或 docker run -d centos:latest tail -f /etc/hosts 基于nginx启动一个容器,监听80和81,访问80,出现nginx默认欢迎首页,访问81,出现text web server 先在本地创建一个目录 mkdir -p /data 生辰默认首页文件 echo "text web server" > /data/index.html 生成nginx配置文件 vim /opt/text.conf server { listen 81; server_name localhost; root /opt/ index index.html index.htm; location / { } } 启动容器映射端口,并映射目录 docker run -d -p 80:80 -p 81:81 -v /opt/text.conf:/etc/nginx/conf.d/text.conf -v /data/:/opt/ nginx:latest 解释: -p 80:80 -p 81:81 容器的80映射到宿主机的80 容器的81映射到宿主机的81 多端口映射 -v /opt/text.conf:/etc/nginx/conf.d./text.conf 把物理机/opt/text.conf映射到容器中/etc/nginx/conf.d./text.conf 这里映射的路径一定写全路径,也要写上文件名,如何后面只写目录会报错,必须要写上文件名 -v /data/:/opt/ 把物理机的/data/目录映射到容器的/opt/目录下 第二中方法 首先先把所有的容器结束掉 docker rm -f `docker ps -a -q` 启动容器 docker run -itd -p 80:80 -p 81:81 -v /data:/opt nginx:latest 进入容器 docker exec -it b2080baa3161 /bin/bash 添加nginx的配置文件 echo "server { listen 81; server_name localhost; root /opt/; index index.html index.htm; location / { } }">/etc/nginx/conf.d/test.conf 重启容器 docker restart b2080baa3161 手动创建容器 Dockerfile 需求用现有的容器,现有的容器名称叫centos7-ansible然后把一个index.html文件复制到容器的/data/www/html/下,并生成一个新的容器名字叫centos7:v1-1 创建一个存放dockerfile文件的目录 mkdir -p /20210318/docker-file 进入这个目录里面 cd /20210318/docker-file/ 在/20210318/docker-file/下创建index.html,并追加内容进里面 echo <h1>Busybox httpd server.</h1> > /20210318/docker-file/index.html 编辑一个Dockerfile文件,名称一定不能改变首字母要大写 vim Dockerfile 添加内容 FORM centos7-ansible MAINTAINER "9527edu <9527@9527edu.org>" COPY index.html /data/web/html/ 保存退出 生成新的容器 docker image build -t centos7:v1-1 ./ 解释: docker image build 读取dockerfile并生成新的容器 -t centos7:v1-1 新容器的名称 ./ 读取当前目录下Dockerfile文件 FORM centos7-ansible 读取容器中现有的容器 MAINTAINER "9527edu <9527@9527edu.org>" 作者介绍,可忽略 COPY index.html /data/web/html/ 把dockfile文件下的index.html 复制到容器的/data/web/html/下,如果容器中此目录不存在会自动创建 常用指令 FROM 指定现有的容器名称 COPY 拷贝当前Dockerfile目录里的文件 COPY <src> <sest> COPY ["<src>" "<src>" "<dest>"] <src> 要复制的源文件或目录,支持使用通配符 <dest> 目标路径,既正在创建的image的文件系统路径,建议<dest>使用绝对路径,否则COPY指定则以WORKDIR为起始路径 文件复制准则 如果<src>是目录,则其内部文件或子目录会被递归复制,但<stc>目录自身不会被复制·如果指定了多个<src>, 或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以结尾 如果<dest>事先不存在,它将会被自动创建,这包括其父目录路径 例子: COPY index.html /www/html/ 解释" 把当前Dockerfile目录下的index.html复制容器的/www/html/下 ADD ADD指令类似于COPY命令,ADD支持使用TAR文件和URL路径 Syntax ADD <src> ...<dest>或·ADD ["<src>".... "<dest>"]·操作准则 同COPY指令 如果<src>为URL且<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<dest>;如果<dest>以/结尾, 则文件名URL指定的文件将被直接下载并保存为<dest>/<filename>·如果<sc>是一个本地系统上的压缩格式的tar文件, 它将被展开为一个目录,其行为类似于“tar -x"命令;然而,通过URL获取到的tar文件将不会自动展开 如果<src>有多个,或其间接或直接使用了通配符,则<dest>必须是一个以/结尾的目录路径﹔如果<dest>不以/结尾则其被视作一个普通文件, <src>的内容将被直接写入到<dest> 如果ADD 后面根的是URL,而且是tar文件,则不会展开 例子: ADD http://nginx.org/download/nginx-1.15.2.tar.gz /usr/loca/src/ 如果ADD后面跟着是一个tar文件,它会自动解压到你所指定的目录 例子: ADD nginx-1.19.8.tar.gz /usr/local/src/ WORKDIR 指定容器的默认工作目录 指定一个环境变量 例子: WORKDIR /usr/local/src/ LABEL 制作镜像者,名字和邮箱 MAINTAINER 管理者的信息和LABEL功能一样新版本建议用LABEL ENTRYPOINT 容器启动的时候执行的初始命令,不能被替换,如果同时使用CMD和ENTRYPOINT,CMD命令将作为ENTRYPOINT命令的参数 EXPOST 要暴露的端口 VOLUME 持久化卷 ENV 环境变量,(ssh的密码,数据库的密码)给容器里面指定一个环境变量 自己单独构建一个alpine镜像 原始镜像下载地址 https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/ 这里以alpine为例 https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.12/amd64/default/20210321_13%3A00/rootfs.tar.xz 创建容器存放的目录 mkdir -pv /data/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}} 在centos里把这个镜像下载到你存放dockerfile 先进入到目录里面 cd /data/dockerfile/system/alpine/ 下载 wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.12/amd64/default/20210321_13%3A00/rootfs.tar.xz 查看下载的文件 # ls rootfs.tar.xz 创建一个Dockerfile vim Dockerfile 写入以下内容 FROM scratch ADD rootfs.tar.xz / CMD ["/bin/sh"] 解释: FROM scratch 重新开始,创建一个初始镜像 scratch=起跑线,从头开始 ADD rootfs.tar.xz / 把下载好的rootfs.tar.xz的文件解压到/根下 CMD ["/bin/sh"] 系统启动命令,这里是启动是[/bin/sh] 开始构建 docker build -t alpine:v1 . 把新创建的alpine名称改成V1 自己单独构建一个centos7镜像 原始镜像下载地址 https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/ 这里以centos7为例 https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/centos/7/amd64/default/ 下载centos7的镜像,这里不一定能下载成功 wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/centos/7/amd64/default/20210322_07%3A08/rootfs.tar.xz 查看下载的文件 # ls rootfs.tar.xz 创建一个Dockerfile vim Dockerfile 写入以下内容 FROM scratch ADD rootfs.tar.xz / CMD ["/bin/bash"] 解释: FROM scratch 重新开始,创建一个初始镜像 scratch=起跑线,从头开始 ADD rootfs.tar.xz / 把下载好的rootfs.tar.xz的文件解压到/根下 CMD ["/bin/sh"] 系统启动命令,这里是启动是[/bin/bash] 开始构建 docker build -t centos7:v1 . 创建自己的镜像 先来创建目录 mkdir -pv /data/dockerfile/{web/{nginx,tomcat,jdk,apache},system/{centos,ubuntu,alpine,debian}} 创建一个基础镜像 进入到centos目录 cd /data/dockerfile/system/centos/ 创建一个Dockerfile vim Dockerfile 写入以下内容 RUN yum install epel* -y && yum install lrzsz gcc gcc-c++ automake pcre-devel make openssl-devel zlib zlib-devel iproute net-tools iotop unzip -y RUN groupadd www -g 2020 && useradd www -u 2020 -g www && groupadd nginx -g 2021 && useradd nginx -u 2021 -g nginx 创建镜像 docker build -t centos7test:v1 . 创建jdk8U261的容器基于centos7test:v1 先进入目录/data/dockerfile/web/jdk/ cd /data/dockerfile/web/jdk/ 创建jdk相关版本的目录 mkdir /data/dockerfile/web/jdk/jdk-8u261 -p 进入刚创建的目录 cd /data/dockerfile/web/jdk/jdk-8u261 上传jdl8u261的tar包,根据自己的喜欢上传 ls jdk-8u261-linux-x64.tar.gz 需要准备一个fprofile文件 先来把jdk-8u261-linux-x64.tar.gz解压到/usr/local/src/下 tar -xf jdk-8u261-linux-x64.tar.gz -C /usr/local/src/ 创建软连接 ln -s /usr/local/src/jdk1.8.0_261/ /usr/local/jdk 添加宿主机的环境变量,不是容器的 vim /etc/profile 最后一行添加如下内容 export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar export PATH JAVA_HOME CLASSPATH 保存退出 让宿主机的环境变量生效 . /etc/profile 宿主机查看 java -version 返回结果 java version "1.8.0_261" Java(TM) SE Runtime Environment (build 1.8.0_261-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode) 把宿主机的/etc/profile拷贝到/data/dockerfile/web/jdk/jdk-8u261/下 cp /etc/profile /data/dockerfile/web/jdk/jdk-8u261/ 在/data/dockerfile/web/jdk/jdk-8u261/下创建Dockfile cd /data/dockerfile/web/jdk/jdk-8u261/ vim Dockerfile 写入以下内容 FROM centos7test:v1 ADD jdk-8u261-linux-x64.tar.gz /usr/local/src/ RUN ln -sv /usr/local/src/jdk1.8.0_261 /usr/local/jdk ADD profile /etc/profile ENV JAVA_HOME /usr/local/jdk ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib ENV PATH $PATH:$JAVA_HOME/bin RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 生成新的容器 docker build -t centos7-jdk:8u261 . 解释: FROM centos7test:v1 初始容器名称 ADD jdk-8u261-linux-x64.tar.gz /usr/local/src/ 把本地的ADD jdk-8u261-linux-x64.tar.gz解压到/usr/local/src/ RUN ln -sv /usr/local/src/jdk1.8.0_261 /usr/local/jdk 创建软连接 ADD profile /etc/profile 把本地的profile复制到/etc/profile ENV JAVA_HOME /usr/local/jdk ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/:$JRE_HOME/lib ENV PATH $PATH:$JAVA_HOME/bin 让系统调用java的环境变量,默认root不会读取/etc/profile里的环境变量 RUN rm -rf /etc/localtime && ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 删除掉默认的时区,把亚洲上海的文件软连接文件到/etc/localtime 创建tomcat-8.5.64的容器基于centos7-jdk:8u261 进入到tomcat目录里 cd /data/dockerfile/web/tomcat 创建tomcat8的目录 mkdir -p /data/dockerfile/web/tomcat/tomcat8-base 进入这个目录里 cd /data/dockerfile/web/tomcat/tomcat8-base 下载tomcat wget https://mirrors.bfsu.edu.cn/apache/tomcat/tomcat-8/v8.5.64/bin/apache-tomcat-8.5.64.tar.gz 编辑一个dockerfile文件 vim Dockerfile 写入以下内容 FROM centos7-jdk:8u261 ADD apache-tomcat-8.5.64.tar.gz /usr/local/ RUN ln -sv /usr/local/apache-tomcat-8.5.64 /usr/local/tomcat 生成tomcat8-base容器 docker build -t tomcat8-base:v1 . 创建tomcat容器,先来应用目录 创建目录 mkdir -p /data/dockerfile/web/tomcat/tomcat-app1 进入目录 cd /data/dockerfile/web/tomcat/tomcat-app1 单独准备一个server.xml 可以把从别的主机上拷贝一个或者解压tomcat的包,复制出来也可以,我这里直接解压tomcat的包,然后复制出来 解压 tar -xf apache-tomcat-8.5.64.tar.gz -C /usr/local/ 复制到当前目录 cp /usr/local/apache-tomcat-8.5.64/conf/server.xml /data/dockerfile/web/tomcat/tomcat-app1/ 创建一个测试页面 先来创建一个目录存放测试页面 mkdir -p /data/dockerfile/web/tomcat/tomcat-app1/test/ 创建一个html文件 echo test web1 page > /data/dockerfile/web/tomcat/tomcat-app1/test/index.html 打包文件 先进入目录 cd /data/dockerfile/web/tomcat/tomcat-app1/ 再来打包 tar -czvf /data/dockerfile/web/tomcat/tomcat-app1/web1.tar.gz test/* 编辑server.xml vim server.xml 这里只是简单的修改以下,可以根据自己的实际需求修改做相应的优化 修改的内容 未改 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> 改后 <Host name="localhost" appBase="/data/web/webapps" unpackWARs="false" autoDeploy="false"> 解释: appBase="appBase="/data/web/webapps 把网站源码目录放到容器中的appBase="/data/web/webapps/下 unpackWARs="false" 不自动解压war包 autoDeploy="false 不自动部署 编写一个run_tomcat.sh启动脚本,方便tomcat在容器中启动 可以写一下其他的命令非交互式的比如host解析或者dns的修改 vim run_tomcat.sh 写入以下内容 #!/bin/bash #echo "172.16.3.1 dns1.9527edu.org" >> /etc/hosts #echo "172.16.3.2 dns2.9527edu.org" >> /etc/hosts echo "nameserver 223.5.5.5" > /etc/resolv.conf su - www -c "/usr/local/tomcat/bin/catalina.sh start" tail -f /etc/hosts 解释: #echo "172.16.3.1 dns1.9527edu.org" >> /etc/hosts #echo "172.16.3.2 dns2.9527edu.org" >> /etc/hosts 修改本地hosts解析 echo "nameserver 223.5.5.5" > /etc/resolv.conf 修改本地dns指向地址 su - www -c "/usr/local/tomcat/bin/catalina.sh start" 切换到www用户,并用www用户启动tomcat tail -f /etc/hosts 一守护进程方式运行,不怕服务当掉 给run_tomcat.sh一个执行权限否则在容器中无法执行没因为没有权限执行 chmod a+x run_tomcat.sh 编译一个dockerfile文件 vim Dockerfile 写入以下内容 FORM tomcat8-base:v1 ADD server.xml /usr/local/tomcat/conf/server.xml ADD web1.tar.gz /data/web/webapps RUN chown -R www.www /usr/local/tomcat/ ADD run_tomcat.sh /usr/local/tomcat/bin/run_tomcat.sh EXPOSE 8080 8005 8009 CMD ["/usr/local/tomcat/bin/run_tomcat.sh"] 生成新的容器 docker build -t tomcat-app1:v1 . 启动容器 docker run -itd -p 8080:8080 tomcat-app1:v1 创建Tomcat-7.0.82的容器基于centos7:v1 创建目录 mkdir -p /data/dockerfile/web/tomcat/tomcat7 进入目录 cd /data/dockerfile/web/tomcat/tomcat7 将jdk7和tomcat7安装包放入tomcat7 #ls apache-tomcat-7.0.82.tar.gz jdk-7u80-linux-x64.tar.gz 编写Dockerfile文件 vim Dockerfile 写入以下内容 FROM centos7:v1 #上传 ADD apache-tomcat-7.0.82.tar.gz /opt/tomcat ADD jdk-7u80-linux-x64.tar.gz /opt/jdk COPY /run.sh /root/run.sh RUN chmod 777 /root/run.sh #环境变量 ENV JAVA_HOME=/opt/jdk/jdk1.7.0_80/jre ENV PATH=:$JAVA_HOME/bin:$PATH ENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar ENTRYPOINT ["/root/run.sh"] 编写run.sh启动脚本 vim run.sh 写入以下内容 #!/bin/bash sh /opt/tomcat/apache-tomcat-7.0.82/bin/catalina.sh run 生成新的容器 docker build -t tomcat:7 . 基于alpine创建一个nginx的容器 先来创建目录 mkdir -p /data/dockerfile/web/nginx-alpine 进入目录 cd /data/dockerfile/web/nginx-alpine 编写Dockerfile文件 vim Dockerfile 写入以下内容 FROM alpine:v1 #RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories RUN apk add iotop gcc libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs make pcre pcre2 zip unzip net-tools pstree wget libevent libevent-dev iproute2 ADD nginx-1.18.0.tar.gz /usr/local/src ADD nginx.conf /usr/local/nginx/conf/nginx.conf ADD v1.conf /usr/local/nginx/conf.d/ RUN echo test web-nginx-alpine page > /usr/local/nginx/html/index.html RUN cd /usr/local/src/nginx-1.18.0/ && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/ng inx /usr/sbin/ EXPOSE 80 443 CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] 准备nginx主配置文件 vim nginx.conf 写入以下内容 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /usr/local/nginx/conf.d/*.conf; } 准备虚拟主机文件 server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } # location /app1 { # proxy_pass http://172.16.30.222:8080; # } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } 下载nginx-1.18.0源码包 wget http://nginx.org/download/nginx-1.18.0.tar.gz 生成新的容器 docker build -t alpine-nginx:v1 . 基于ubuntu创建一个nginx的容器 先来来创建目录 mkdir -p /data/dockerfile/web/nginx-ubuntu