Docker

173 阅读6分钟

概念

225949_49826c44_715683.png

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 命令查看 093706_ab0c13d4_715683.png
  • (选做) 如果内核小于 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

094908_a2a2fbac_715683.png

安装镜像

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.confdefault.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