一 Docker安装步骤解析
1.1 基础命令
1.1.1 Docker安装前置任务
#使用uname -r 查看系统内核,Docker 要求CentOS系统的内核版本高于 3.10
#确认yum更新到最新(yum update)
1、卸载旧版本Docker
```
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker.io
rm -rf /var/lib/docker #删除镜像/容器/卷配置文件
yum remove docker*
```
2、安装Docker CE
```
#安装工具包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装最新版本
yum install docker-ce docker-ce-cli containerd.io
#存在问题:
#安装最新版本container-selinux:
yum install -y \
http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.74-1.el7.noarch.rpm
#上述插件安装失败,提示:
Requires: selinux-policy-targeted >= 3.13.1-216.el7
Requires: selinux-policy-base >= 3.13.1-216.el7
Requires: selinux-policy >= 3.13.1-216.el7
Requires: policycoreutils >= 2.5-11
#
#启动Docker服务
systemctl start docker
#验证Docker启动正常
docker run hello-world
#设置开机启动
chkconfig docker on 或 systemctl enable docker.service
#设置阿里云镜像加速器
#使用配置文件/etc/docker/daemon.json(没有时新建该文件)
{
"registry-mirrors": ["https://XXXX.mirror.aliyuncs.com"]
}
#重启服务
systemctl daemon-reload
systemctl restart docker
```
Docker启动目录更改
1>停止docker服务:systemctl stop docker
2> vim /etc/docker/daemon.json
添加"data-root":"/usr/local/dockerData"(docker存储路径)
{
"data-root":"/usr/local/dockerData",
"registry-mirrors": ["https://XXXX.mirror.aliyuncs.com"]
}
3> 查看当前docker存储位置
docker info
Docker基础用法
获取Nginx镜像
docker pull nginx
删除镜像
#删除镜像前,确保没有容器使用该镜像
docker ps -a
#存在则删除该容器
docker rm 容器ID
#成功后删除镜像
docker rmi 镜像ID
镜像查看
docker images
容器查看(进程查看)
docker ps -a
查看docker容器所用ip
docker inspect 容器名/序列号 | grep -i address
创建映射到宿主机的配置文件及目录
#logs目录映射为nginx容器的日志目录,conf目录中的配置文件映射为nignx容器的配置文件目录
mkdir -p /nginx/logs /nginx/conf.d
#在/nginx目录下创建编辑主配置文件nginx.conf
vim nginx.conf
内容如下:
#设置运行的用户
user root;
#设置nginx要开启的子进程数量,一般设置为和CPU数量相等值
work_processes 1;
#设置全局错误日志位置和级别
error_log /var/log/nignx/error.log error;
#设置进程id的存放位置
pid /var/run/nigx/pid;
events{
#设置线程轮询的方案,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue
use epoll;
#设置单个work_processes的最大的并发连接数
worker_connections 1024;
}
http{
#设置mime类型,类型由mime.type文件定义
include mime.types;
default_type application/octet-stream;
#设置一个名为main的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#设置访问日志的位置,使用main的格式
access_log /var/log/nginx/access.log main;
#设置连接超时时间
keepalive_timeout 65;
#设置gzip功能为开启
gzip on;
gzip_disable "msie6";
#设置请求缓冲
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#设置nginx是否使用sendfile函数(普通应用设on,而下载等磁盘重负载应用为设off)
sendfile on;
#设置当前配置文件包含另一个子配置文件
include /etc/nginx/conf.d/*.conf;
}
在/nginx/conf.d目录下创建nginxchild.conf文件,内容如下:
#虚拟主机配置
server{
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
}
#启动Nginx容器,并挂载相应文件和目录
docker run -d --name nginx01 \
--mount type=bind,src=/nginx/nginx.conf,dst=/etc/nginx/nginx.conf:ro \
--mount type=bind,src=/nginx/conf.d,dst=/etc/nginx/conf.d \
--mount type=bind,src=/nginx/logs,dst=/var/log/nginx \
-p 8083:80 nginx
PS:
1>开放端口8083,并无其他进程占用
2>-p表示将服务器端口左80映射到容器内端口右80,
-d表示在后台运行,
--name表示启动后的容器名称,
第一个mount表示将本地自定义目录的自定义主配置文件映射为容器的主配置文件,
第二个mount表示将本地自定义的子配置文件目录映射为容器的子配置文件目录,
第三个mount表示将本地自定义的日志目录映射为容器的日志目录。
#重启容器
docker restart 容器ID/容器名称
#进入容器
docker exec -it 容器ID/别名 /bin/bash
PS:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format:
-w, --workdir string Working directory inside the container
#创建镜像
docker build -t image_name .
PS:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--network string Set the networking mode for the RUN instructions during build (default "default")
--no-cache Do not use cache when building the image
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful build (default true)
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
-t, --tag list Name and optionally a tag in the 'name:tag' format
-t 设置tag名称, 命名规则registry/image:tag(若不添加版本号,默认latest)
. 表示使用当前目录下的Dockerfile文件(注意语句后面有一个点)
-f 后加自定义Dockerfile文件
使用Dockerfile创建tomcat镜像
#准备工作
#CentOS镜像
docker pull centos
#下载jdk,tomcat安装包,上传至/usr/local/soft目录,解压,创建Dockerfile文件
tar -zxvf apache-tomcat-版本号.tar.gz #解压tomcat
tar -zxvf jdk-版本号-linux-x64.tar.gz #解压jdk
rm -rf apache-tomcat-版本号.tar.gz #删除安装包
rm -rf jdk-版本号-linux-x64.tar.gz #删除安装包
touch Dockerfile #创建文件
#编辑Dockerfile
#指定操作的镜像
FROM centos
# 维护者信息
MAINTAINER Jackzz
#执行命令:指定工作目录,无则创建
WORKDIR /usr/local/soft
#将jdk添加到镜像centos的/usr/local/soft/目录下,并命名为jdk
ADD jdk1.8.0_171 /usr/local/soft/jdk
#将tomcat添加到镜像centos的/usr/local/soft/目录下,并命名为tomcat
ADD apache-tomcat-8.5.31 /usr/local/soft/tomcat
#添加环境变量
ENV JAVA_HOME /usr/local/soft/jdk
ENV CATALINA_HOME /usr/local/soft/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#暴露8080端口
EXPOSE 8080
#启动时运行tomcat
CMD ["/usr/local/soft/tomcat/bin/catalina.sh","run"]
PS:
FROM : 指定基础镜像,并且必须是第一条指令
MAINTAINER : 指定作者
RUN : 运行指定的命令
ADD : 复制命令,把文件复制到镜像中。
ENV : 设置环境变量
EXPOSE : 功能为暴漏容器运行时的监听端口给外部
CMD : 指定容器启动时运行的命令
[可参考Dockerfile参数介绍](http://www.dockerinfo.net/dockerfile%E4%BB%8B%E7%BB%8D)
#构建Docker镜像
docker build -t jackzz/jdk_tomcat .
-t 设置tag名称, 命名规则registry/image:tag(若不添加版本号,默认latest)
. 表示使用当前目录下的Dockerfile文件(注意语句后面有一个点)
#启动镜像,访问容器
docker run -d -p 8084:8080 --name tomcat jackzz/jdk_tomcat
-d 后台运行
-p 端口映射 宿主机port : 容器port
--name 指定容器运行名称
[以上内容参考地址](https://blog.csdn.net/qq_37936542/article/details/80824389)
#发布image文件
#登录docker
docker login
#登录私有仓库
docker login ip:5000
#为本地image标注用户名和版本
docker image tag [imageName] [username]/[repository]:[tag]
或重构image文件
docker image build -t [username]/[repository]:[tag] .
#发布image文件
docker image push [username]/[repository]:[tag]
5 其他命令
#列出当前停止运行的容器id
docker ls -f "status=exited" -q
-q 只显示容器id
#批量删除停止运行的容器
docker rm $(docker ls -f "status=exited" -q)
#Dockerfile语法
#RUN
# 每个RUN命令构建成镜像中的一层,复杂的RUN用反斜线换行,&&合并多条命令成一行
RUN yum update && yum install -y vim \
python-dev
#WORKDIR
# 设置工作目录,不存在则创建
#ADD/COPY添加本地文件到容器,curl/wget添加远程文件到容器
# 大部分情况,COPY优于ADD!ADD除COPY功能外还有解压功能!
# 添加远程文件/目录使用curl或者wget!
WORKDIR /root
ADD hello test/ #将宿主机当前目录下hello文件复制到容器/root/test/hello
ADD test.tar.gz / # 添加到根目录并解压
#ENV 设置变量
RUN : 执行命令并创建新的Image Layer
CMD :设置容器启动后默认执行的命令和参数
ENTRYPOINT :设置容器启动时运行的命令
#Shell格式
RUN apt-get update && apt-get install -y vim
ENV name Docker
CMD echo "hello $name"
ENTRYPOINT echo "Hello $name"
#Exec格式
RUN ["apt-get", "install", "-y", "vim"]
NV name Docker
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/bash", "-c", "echo hello $name"]
Shell格式可识别$,并替换相应变量;Exec不能直接识别$,需更换/bin/bash命令
#CMD简介
1、容器启动时默认执行的命令;
2、如果docker run指定了其他命令,CMD命令被忽略;
3、如果定义了多个CMD,只有最后一个会执行。
#ENTRYPOINT
1、让容器以应用程序或服务的形式运行;
2、不会被忽略,一定会执行。
#### 综合练习
##### 一、docker+Nginx+tomcat实现负载均衡
#步骤1:
启动N个映射端口号不同的tomcat容器
#步骤2:
在相应tomcat的/webapps/ROOT目录下更改index.jsp,区分不同tomcat调用。
参考index.jsp如下:
<%@ page language="java" contentType="text/html; charset=utf-8" import="java.net.InetAddress"
pageEncoding="utf-8"%>
<%
InetAddress addr = InetAddress.getLocalHost();
out.println("主机地址:"+addr.getHostAddress());
out.println("主机名:"+addr.getHostName());
%>
步骤3:
更改上述nginx配置文件/conf.d/nginxchild.conf,详细内容如下:
upstream pic {
server 172.17.0.1:8084 weight=1;
server 172.17.0.1:8085 weight=3;
}
#虚拟主机配置
server{
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html index.htm;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_pass http://pic/;
}
}
PS:常见问题nginx 104: Connection reset by peer或111: Connection refused,均是该配置文件地址错误造成。
上述IP地址172.17.0.1是docker自定义网段ip地址,使用ifconfig查看
步骤4:
启动nginx
docker run -d --name nginx \
--mount type=bind,src=/usr/local/docker/nginx/nginx.conf,dst=/etc/nginx/nginx.conf:ro \
--mount type=bind,src=/usr/local/docker/nginx/conf.d,dst=/etc/nginx/conf.d \
--mount type=bind,src=/usr/local/docker/nginx/logs,dst=/var/log/nginx \
-p 8081:80 nginx
二、docker+nginx+tomcat+mysql
#MySQL镜像下载:
docker search mysql
docker pull mysql:5.7
#创建宿主机目录,作持久化
mkdir -p data
mkdir -p conf.d
启动MySQL容器
docker run --name mysql5.7 -p 3306:3306 /
-v /usr/local/docker/mysql/data:/var/lib/mysql /
-v /usr/local/docker/mysql/conf.d:/etc/mysql/conf.d /
-e MYSQL_ROOT_PASSWORD=root -d mysql:5.7
进入MySQL容器
docker exec -it mysql5.7 mysql -uroot -proot
PS:
-p 3306:3306 #将容器的3306端口映射到主机的3307端口
-v $PWD/conf:/etc/mysql/conf.d #将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf
-e MYSQL_ROOT_PASSWORD=root #初始化root用户的密码
问题
#当关闭防火墙后,再启动容器,则会报以下错误
docker: Error response from daemon: driver failed programming external connectivity on endpoint elastic_pare (89c6d7577b0d1082a9576142748589f7a790723169d457620a237ef0c3b8de03): (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 6379 -j DNAT --to-destination 172.17.0.3:6379 ! -i docker0: iptables: No chain/target/match by that name
重启防火墙即可