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