本文在centos7 上安装docker,并创建三个容器,一个nginx,两个tomcat容器。客户请求nginx,可以随机分配到任意一个tomcat上。
本文安装的是docker-ce 版本,这个版本是免费的。
1.安装docker
安装需要的包
使用非root用户登录
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
设置稳定的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装docker CE
sudo yum install docker-ce
启动docker
sudo systemctl start docker
运行hello-world image
sudo docker run hello-world
通常会报下面错误,这是由于国内网络原因,可以多试几次,实在不行就算了,应该安装没问题,这只是个demo而已。
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout.
对于非root用户,如果不想使用sudo, 可以将用户添加到docker组
sudo usermod -aG docker tanzhang
需要退出重新登录,此时就不用加sudo 。
配置镜像加速器
默认docker 没有daemon.json 所以要自己新建,放到/etc/docker/daemon.json 。
可以查看https://yq.aliyun.com/articles/29941使用方法。登录容器Hub服务注册一个,获取为你独立分配的加速地址。
新建一个daemon.json。只需放入以下内容即可。
{
“registry-mirrors”: [“address”]
}
下载centos镜像
docker search centos
docker pull docker.io/centos
查看镜像
docker images
创建docker 容器 -i表示交互模式,-t表示分配一个root用户
docker run -i -t docker.io/centos /bin/bash
此时已经进入容器内部,系统会自动分配一个root用户
当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
检查本地是否存在指定的镜像,不存在就从公有仓库下载
利用镜像创建并启动一个容器
分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
从地址池配置一个 ip 地址给容器
执行用户指定的应用程序
执行完毕后容器被终止
docker run的参数:
-a=map[]: 附加标准输入、输出或者错误输出
–c=0: 共享CPU格式(相对重要)
–cidfile=“”: 将容器的ID标识写入文件
–d=false: 分离模式,在后台运行容器,并且打印出容器ID
–e=[]:设置环境变量
–h=“”: 容器的主机名称
–i=false: 保持输入流开放即使没有附加输入流
–privileged=false: 给容器扩展的权限
–m=“”: 内存限制 (格式:, unit单位 = b, k, m or g)
–n=true: 允许镜像使用网络
–p=[]: 匹配镜像内的网络端口号 支持格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort。
–rm=false:当容器退出时自动删除容器 (不能跟 -d一起使用)
–t=false: 分配一个伪造的终端输入
–u=“”: 用户名或者ID
–dns=[]: 自定义容器的DNS服务器
–v=[]: 创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro].如果容器目录丢失,docker会创建一个新的卷
–volumes-from=“”: 挂载容器所有的卷
–entrypoint=“”: 覆盖镜像设置默认的入口点
–w=“”: 工作目录内的容器
–lxc-conf=[]: 添加自定义-lxc-conf=“lxc.cgroup.cpuset.cpus = 0,1″
–sig-proxy=true: 代理接收所有进程信号(even in non-tty mode)
–expose=[]: 让你主机没有开放的端口
–link=“”: 连接到另一个容器(name:alias)
–name=“”: 分配容器的名称,如果没有指定就会随机生成一个 ,容器的名称是唯一的。
–P=false: Publish all exposed ports to thehost interfaces 公布所有显示的端口主机接口
退出容器
exit
退出不关闭
ctrl+p+q
查看容器
docker ps -a
容器操作
docker start/stop/restart/attach
-i,可以直接进入交互模式(相当于先start再attach)
docker attach ,进入一个正在运行的容器
生成镜像
docker commit [OPTION] < newImageName>
docker commit 03579926f597 init-centos
删除容器和镜像
docker rm 删除指定容器
docker rmi 删除一个或多个image
docker ps -a -q | xargs docker rm 删除所有的容器
持久化容器
docker export > /tmp/.tar
持久化镜像
docker save > /tmp/.tar
导入持久化容器
cat /tmp/export_container.tar | docker import - :
注意,导入之后是生成新的镜像而不是容器!
导入持久化镜像
docker rmi 删除镜像
docker load < /tmp/save_image.tar 加载镜像
docker tag load:tag 为镜像打TAG
两种方式的比较:
导出容器再导入为镜像的方式会丢失历史信息,而保存镜像再加载为镜像的方式不会丢失历史和层,可以做到层回滚
yum install -y penssl openssh-server
启动服务
/usr/sbin/sshd
报错,运行下列命令,生成key
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -N ''
ssh-keygen -q -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ''
ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key -N ''
ctrl+p+q 退出
将刚刚的修改生成新的镜像
docker commit 03579926f597 sshd-centos
以上面sshd-centos 镜像生成三个container,一个按照nginx,连个安装tomcat.
安装tomcat
用sshd-centos镜像生成container, -p 是主机端口和container端口映射,这样访问主机端口就可以访问container.
docker run -it -p 10020:22 sshd-centos /bin/bash
开启ssh服务
/usr/sbin/sshd
安装jdk
yum search jdk
yum install -y java-1.8.0-openjdk.x86_64
安装tomcat
下载
http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.tar.gz
用xftp上传到container
tar -zxvf apache-tomcat-8.5.23.tar.gz
将修改保存为新的镜像
docker commit 983d6aaa8ffb tomcat-os
下面将启动两个container, 一个名字叫tomcat001. 一个叫tomcat002.
docker run --name=tomcat001 -it -p 18080:8080 -p 10020:22 tomcat-os /bin/bash
启动后进入container内 开启ssh服务和tomcat服务。
docker run --name=tomcat002 -it -p 18081:8080 -p 10021:22 tomcat-os /bin/bash
安装nginx
进入一个安装了ssh服务,没有安装tomcat的容器。
先安装依赖库
rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
安装
yum install nginx -y
生成镜像
docker commit 03579926f597 nginx-os
启动新容器,–link 指定可以连接的容器,使用此参数可以让容器之间通信。
docker run --name=nginx --link=tomcat001:t01 --link=tomcat002:t02 -it -p 10080:80 -p 10022:22 nginx-ssh-centos /bin/bash
修改配置文件
vi /etc/nginx/nginx.conf
加入一下内容,t01,t02 为两个tomcat 容器别名
upstream bo.test.com {
server t01:8080 weight=1;
server t02:8080 weight=1;
}
完整的nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream bo.test.com {
server t01:8080 weight=1;
server t02:8080 weight=1;
}
include /etc/nginx/conf.d/*.conf;
}
修改default.conf
vi /etc/nginx/conf.d/default.conf
改掉location配置
location ~ {
proxy_pass http://bo.test.com;
}
启动服务
/usr/sbin/nginx
如果已经启动,可以reload
/usr/sbin/nginx -s reload
浏览器访问
说明配置成功,但不知道访问的是哪个tomcat容器,可以分别到两个tomcat容器里修改examples 项目里的index.html 文件。
vi /root/apache-tomcat-8.5.23/webapps/examples/index.html
分别在body先加入
<body>
this is container tomcat001
<body>
this is container tomcat002