安装docker并架构nginx+tomcat容器

本文在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并架构nginx+tomcat容器_第1张图片

删除容器和镜像
docker rm 删除指定容器
docker rmi 删除一个或多个image
docker ps -a -q | xargs docker rm 删除所有的容器
持久化容器
docker export > /tmp/.tar
这里写图片描述
持久化镜像
docker save > /tmp/.tar
安装docker并架构nginx+tomcat容器_第2张图片
导入持久化容器
cat /tmp/export_container.tar | docker import - :
安装docker并架构nginx+tomcat容器_第3张图片
注意,导入之后是生成新的镜像而不是容器!
导入持久化镜像
docker rmi 删除镜像
docker load < /tmp/save_image.tar 加载镜像
docker tag load:tag 为镜像打TAG
安装docker并架构nginx+tomcat容器_第4张图片
两种方式的比较:
导出容器再导入为镜像的方式会丢失历史信息,而保存镜像再加载为镜像的方式不会丢失历史和层,可以做到层回滚

2.给容器配置ssh
登录容器
这里写图片描述
修改密码
安装docker并架构nginx+tomcat容器_第5张图片
安装ssh服务

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 ''

安装docker并架构nginx+tomcat容器_第6张图片

ctrl+p+q 退出
将刚刚的修改生成新的镜像

docker commit 03579926f597 sshd-centos

安装docker并架构nginx+tomcat容器_第7张图片

以上面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

用putty连接container
安装docker并架构nginx+tomcat容器_第8张图片

安装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
安装docker并架构nginx+tomcat容器_第9张图片
安装docker并架构nginx+tomcat容器_第10张图片

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并架构nginx+tomcat容器_第11张图片

docker run --name=tomcat002 -it -p 18081:8080 -p 10021:22 tomcat-os /bin/bash

这里写图片描述

浏览器访问
安装docker并架构nginx+tomcat容器_第12张图片

安装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

浏览器访问
安装docker并架构nginx+tomcat容器_第13张图片
说明配置成功,但不知道访问的是哪个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

再查看浏览器
安装docker并架构nginx+tomcat容器_第14张图片
刷新一下
安装docker并架构nginx+tomcat容器_第15张图片

你可能感兴趣的:(docker,centos)