概念
docker 镜像(Images)
Docker 镜像是用于创建 Docker 容器的模板
docker 容器(Container)
容器是独立运行的一个或一组应用,镜像启动后称为容器
docker 客户端(Client)
客户端通过命令行或者其他工具使用 Docker
docker 主机(Host)
一个物理或者虚拟的机器用于执行 Docker 的守护进程和容器
docker 仓库(Registry)
Docker 仓库用来保存镜像,可以理解为代码控制的代码仓库,Docker Hub 提供了庞大的镜像集合供使用
使用流程,机器安装 docker 应用,然后去仓库下载镜像,镜像下载之后启动镜像,产生容器
常用操作
镜像操作:
| 操作 | 命令 | 说明 |
|---|---|---|
| 检索 | docker search 关键字,如:docker search redis | 去 docker hub 上检索镜像的详细信息(但是直接访问 docker hub 网站查询好不好,所以这个命令不常用) |
| 拉取 | docker pull 镜像名:tag | :tag 是可选的,tag 表示标签,多为软件的版本,默认是 latest |
| 列表 | docker images | 查看所有本地镜像 |
| 删除 | docker rmi image-id | 删除指定的本地镜像 |
容器操作:
| 操作 | 命令 | 说明 |
|---|---|---|
| 运行 | docker run --name 自定义容器名 -d 镜像名,如:docker run -name myredis -d redis | --name:自定义容器名;-d:后台运行;image-name:指定镜像模板 |
| 列表 | docker ps(查看运行中的容器) | 加上 -a 可以查看所有容器 |
| 停止 | docker stop 容器名/容器id | 停止当前运行的容器 |
| 启动 | docker start 容器名/容器id | 启动容器 |
| 删除 | docker rm 容器id | 删除指定容器 |
| 端口映射 | -p 3306:3306 如:docker run -d -p 3306:3306 --name mysql mysql | -p 主机端口(映射到)容器内部端口 |
| 容器日志 | docker logs 容器名/容器id |
docker run [OPTIONS]
OPTIONS说明:
-a stdin:指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;-d:后台运行容器,并返回容器ID;-i:以交互模式运行容器,通常与-t同时使用;-t:为容器重新分配一个伪输入终端,通常与-i同时使用;-P:随机端口映射,容器内部端口随机映射到主机的端口-p:指定端口映射,格式为:主机(宿主)端口:容器端口--name="nginx-lb":为容器指定一个名称;--dns 8.8.8.8:指定容器使用的 DNS 服务器,默认和宿主一致;--dns-search example.com:指定容器 DNS 搜索域名,默认和宿主一致;-h "mars":指定容器的 hostname;-e username="ritchie":设置环境变量;--env-file=[]:从指定文件读入环境变量;--cpuset="0-2" or --cpuset="0,1,2":绑定容器到指定 CPU 运行;-m:设置容器使用内存最大值;--net="bridge":指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;--link=[]:添加链接到另一个容器;--expose=[]:开放一个端口或一组端口;--volume,-v:绑定一个卷--net=host:用host启动就不需要做端口映射(替代-p)--restart=always:跟随 docker 启动--privileged=true:容器 root 用户享有主机 root 用户权限
从 0 搭建 Docker 环境
Docker安装
- 查看 centos 版本
Docker 要求 centos 系统的内核版本高于 3.10,使用
uname -r命令查看 - (选做) 如果内核小于 3.10,使用
yum update升级 - 安装 docker:
yum install docker - 启动 docker:
systemctl start docker - 检查:
docker -v检查版本号 - 将 docker 设置为开机自启动:
systemctl enable docker - 停止 docker:
systemctl stop docker
Docker 安装镜像
搜索 Docker 镜像
以 MySql 为例:
(更推荐直接docker hub查找)搜索 docker 镜像:
docker search mysql
安装镜像
docker pull 镜像名:版本号
docker pull mysql:5.7.31
启动 MySql
docker run -d --net=host --restart=always --privileged=true --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.31 --lower_case_table_names=1
参数说明:
- -d:后台启动
- --net=host:用 host 启动就不需要做端口映射
- --restart=always:跟随 docker 启动
- --privileged=true:容器 root 用户享有主机 root 用户权限
- -e MYSQL_ROOT_PASSWORD=root:设置 root 用户密码
- --lower_case_table_names=1:设置表名参数名等忽略大小写
启动 Redis
普通启动
docker run -d --net=host --restart=always --name redis redis --requirepass "123456" --tcp-keepalive 10
参数说明:
- -d:后台启动
- --net=host:用 host 启动就不需要做端口映射
- --restart=always:跟随 docker 启动
- --requirepass "123456":登录密码
- --tcp-keepalive 10:解决 reids 延迟报错问题
通过配置文件启动
配置文件下载:官网下载
配置文件需要修改:
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no #默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。
dir ./ #输入本地redis数据库存放文件夹(可选)
appendonly yes #redis持久化(可选)
启动命令:
docker run -d --net=host --restart=always --name redis redis --requirepass "123456" -v /redis/conf/redis.conf:/etc/redis/redis.conf -v /redis/data:/data --appendonly yes
参数说明:
-
-v /redis/conf/redis.conf:/etc/redis/redis.conf:挂载持久化配置
-
/redis/conf/redis.conf:是宿主机(服务器)你自己的 redis.conf 文件路径
- /etc/redis/redis.conf:容器内部的 redis.conf 文件路径,不用手动创建,容器启动时会把上边宿主机的 redis.conf 自动映射到该目录下. 这样在修改 redis.conf 文件时候就不用进入到容器内部去修改了
-
-v /redis/data:/data:挂载持久化文件
-
/redis/data:是宿主机中持久化文件的位置
-
/data:是容器中持久化文件的位置
-
--appendonly yes:开启持久化
启动 Nginx
配置文件
在主机下创建挂载目录
mkdir -p /nginx/{conf,html,logs}
# -p 是 --parents 的缩写 它创建直到给定目录的整个目录树。
# {conf,html,logs} 三个并列的文件夹
拷贝容器 nginx.conf 和 default.conf 到主机
docker ps 查看容器ID
docker cp ef:/etc/nginx/nginx.conf /nginx/conf
dokcer cp ef:/etc/nginx/conf.d/default.conf /nginx/conf/conf.d
参数说明:
- cp:命令代表复制
- ef:是我们 nginx 容器的ID
- /etc/nginx/nginx.conf:是容器内部 nginx.conf 路径
修改 nginx.conf 文件
主要检查是否有 include /etc/nginx/conf.d/*.conf;
示例:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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;
# 最主要检查是否有这个属性和路径是否正确
include /etc/nginx/conf.d/*.conf;
}
修改 default.conf 文件
upstream xxxserver{
#ip_hash;
server 192.168.1.101:8182 backup;
server 192.168.1.102:8182;
}
server {
listen 80;
server_name 192.168.1.101;
charset utf-8;
location / {
alias /home/ec2-user/hibate/ROOT/;
}
location /service/ {
proxy_pass http://xxxserver/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 100m;
}
location /admin {
alias /home/ec2-user/hibate/admin/;
try_files $uri $uri/ /admin/index.html;
}
location /merchant {
alias /home/ec2-user/hibate/merchant/;
try_files $uri $uri/ /merchant/index.html;
}
location /source {
alias /home/ec2-user/hibate/source/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
启动命令
docker run -d --name mynginx --net=host --rm --privileged=true -v /nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /nginx/conf/conf.d:/etc/nginx/conf.d -v /nginx/logs:/var/log/nginx -v /home/ec2-user/hibate/ROOT/:/home/ec2-user/hibate/ROOT/ -v /home/ec2-user/hibate/admin/:/home/ec2-user/hibate/admin/ -v /home/ec2-user/hibate/merchant/:/home/ec2-user/hibate/merchant/ -v /home/ec2-user/hibate/source/:/home/ec2-user/hibate/source/ -v /home/ec2-user/hibate/web/:/home/ec2-user/hibate/web/ nginx
参数说明:
- -d:后台运行
- -name:名字
- --net=host:容器可以直接访问主机上所有的网络信息
- --restart=always:随系统重启
- --rm:stop后自动删除容器,与 --restart-always 互斥,只能存在一个
- --privileged=true:容器 root 用户享有主机 root 用户权限
- -v:文件(夹)挂载。格式: 本地路径:容器路径
default.conf 文件里边涉及到的每一个路径 都需要
-v映射一下才好用
启动 RabbitMQ
docker run -d --name rabbitmq --net=host rabbitmq
# 获取docker id
docker ps
docker exec -it 容器id/容器名称 sh
# 启动插件
# 浏览器15672才能访问 用户名密码都是guest
rabbitmq-plugins enable rabbitmq_management