1. docker安装
1.1 卸载系统之前的docker
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
1.2 安装docker CE
sudo yum install -y yum-utils \device-mapper-persistent-data \lvm2
1.3 设置repo yum位置
sudo yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo
1.4 安装docker
yum install -y docker-ce docker-ce-cli containerd.io
1.5 配置docker加速
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'{"registry-mirrors": ["https://bl0ccm0u.mirror.aliyuncs.com"] //此地址配置自己阿里云的加速地址}EOFsudo systemctl daemon-reloadsudo systemctl restart docker
1.6 设置开机自启动
2.docker命令
2.1 查看命令
2.1.1 docker images 查看镜像
参数
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小

如果我们想拉取一个mysql镜像,需要去dockerhub上搜索


如果想自定义拉取指定版本镜像如下图所示,复制命令即可
2.1.2 docker ps -a 和 docker ps
参数
OPTIONS说明:
- -a :显示所有的容器,包括未运行的。
- -f :根据条件过滤显示的内容。
- —format :指定返回值的模板文件。
- -l :显示最近创建的容器。
- -n :列出最近创建的n个容器。
- —no-trunc :不截断输出。
- -q :静默模式,只显示容器编号。
- -s :显示总的文件大小。
docker ps -a 查看所有运行中容器包括未运行
docker ps 为查看所有运行中的容器
2.1.3 docker ps —no-trunc
经验
运用此命令场景
使用RedisDesktopManager连接redis时候发现需要密码登录,这时候管理人员告知是docker启动的redis,如何快速知道docker启动用的是什么密码?
**
此处命令可以看出docker启动用的参数 —requirepass后面的密码为A@1234com
2.1.4 docker ps | grep xxx
2.1.4 docker ps -a | awk ‘/xxx/{print $1}’
awk
此命令在批量查找批量删除,脚本语言中非常重要 awk 务必要多加练习
$0为完整输入参数
$1为第一列的展示参数
2.2 删除命令
参数
OPTIONS说明:
- -f :通过 SIGKILL 信号强制删除一个运行中的容器。
- -l :移除容器间的网络连接,而非容器本身。
-
2.2.1 docker rm -rf xxx
2.2.2 docker rmi xxx
2.2.3 docker rm -v xxx
2.2.4 docker rm $(docker ps -a | awk ‘/xxx/{print $1}’)
批量删除 xxx名字的容器
$1为第一列的参数,我们docker中第一列展示的往往是容器的id所以这个命令删除的是所有容器名xxx的2.2.5 docker rmi $(docker images -q -f dangling=true)
dangling(boolean - true或false,0或1),Dangling(翻译过来”悬空”)一词意味着未使用Dangling 意味着未使用的images表示尚未在容器中分配或使用它。例如,在运行时
docker ps -a- 它将列出所有已退出和当前正在运行的容器。在任何容器内使用的任何images都是“使用过的images”。 另一方面,Dangling images只是意味着你已经创建了images的新构建,但没有给出新名称。所以你所拥有的旧images就变成了“悬空images”。那些旧images是未标记的images,并<none>在运行时在其名称上显示“ ”docker images。 运行docker system prune -a,它将删除未使用和悬空的images。因此,容器中使用的任何images,无论是已退出还是当前正在运行,都不会受到影响 另外,Dockerimages由多个图层组成。Dangling images是与任何标记images无关的图层。它们不再用于目的并占用磁盘空间。docker images —filter “dangling=true”

2.2.6 docker logs [OPTIONS] CONTAINER
docker logs xxxx
OPTIONS说明:
- -f : 跟踪日志输出
- —since :显示某个开始时间的所有日志
- -t : 显示时间戳
-
2.3 启动命令
2.3.1 docker run
docker run -p 3307:3306 --name mysql-master \ -v /mydata/mysql/master/log:/var/log/mysql \ -v /mydata/mysql/master/data:/var/lib/mysql \ -v /mydata/mysql/master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7这里我们以启动一个mysql为例
每一个docker里面都是一个小型的虚拟机,也就是一个我们的linux环境
参数
OPTIONS说明: -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
- -d: 后台运行容器,并返回容器ID;
- -i: 以交互模式运行容器,通常与 -t 同时使用;
- -P: 随机端口映射,容器内部端口随机映射到主机的端口
- -p: 指定端口映射,格式为:主机(宿主)端口:容器端口
- -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- —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: 绑定一个卷
重要
dockerhub中有我们启动容器的环境变量
以下提供 redis rabbitmq 等集群启动例子,按需自取
2.3.2 mysql 主从搭建
创建主mysql
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
创建从mysql
docker run -p 3317:3306 --name mysql-slaver01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
修改master的主从配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
修改slaver里面的主从配置
server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
再加一个
主mysql产生的二进制日志是
mysql.bin
然后配置从mysql
server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
开放端口
systemctl start firewalld
firewall-cmd --zone=public --add-port=1935/tcp --permanen
read-only=0是不是只读的
binlog-do-db=xxx
为哪一个表生成日志
配置好了以后重启docker mysql
4.为master授权用户来他的同步数据
开启远程访问
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';
查看master状态
show master status;
2.从mysql的配置
设置主库连接
告诉从mysql需要同步哪个节点
CHANGE MASTER TO MASTER_HOST='10.244.107.227',MASTER_USER='backup',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=0,MASTER_PORT=3306;
启动从库同步
start slave;
查看从库状态
show slave status;
主库更新,,从库跟着更新
2.3.3 redis cluster 集群搭建
1.创建6个redis节点
for port in $(seq 7001 7006); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.16.0.4
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}
appendonly yes
EOF
docker run -p ${port}:${port} -p 1${port}:1${port} --name redis-${port} --restart always \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d redis:5.0.7 redis-server /etc/redis/redis.conf; \
done
docker stop $(docker ps -a|grep redis-700 | awk '{print $1}')
docker rm $(docker ps -a |grep redis-700 | awk '{print $1}')
批量开启端口
firewall-cmd --zone=public --add-port=7001-7006/tcp --permanent
查看开启的端口
firewall-cmd --list-ports
开启防火墙
systemctl restart firewalld.service
使用redis 建立集群
docker exec -it redis-7001 /bin/bash
redis-cli --cluster create 172.16.0.4:7001 172.16.0.4:7002 172.16.0.4:7003 172.16.0.4:7004 172.16.0.4:7005 172.16.0.4:7006 --cluster-replicas 1
--cluster-replicas 1 每一个主节点都要有一个副本节点
运行效果
等待所有集群加入
-c 代表进入集群模式
redis-cli -c -h 172.16.0.4 -p 7001
查看节点信息 cluster info
查看节点信息 cluster nodes
2.3.4 ES 集群搭建
1.集群搭建
所有之前先运行
sysctl -w vm.max_map_count=262144
查看docker 网络,,docker network ls
docker network create --driver bridge --subnet=172.18.0.1/16 --gateway=172.18.1.1 mynet
2.准备三个master节点
for port in $(seq 1 3); \
do \
mkdir -p /mydata/elasticsearch/master-${port}/config
mkdir -p /mydata/elasticsearch/master-${port}/data
chmod -R 777 /mydata/elasticsearch/master-${port}
cat <<EOF>/mydata/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es
node.name: es-master-${port}
node.master: true
node.data: false
network.host: 0.0.0.0
http.host: 0.0.0.0
http.port: 920${port}
transport.tcp.port: 930${port}
discovery.zen.ping_timeout: 10s
discovery.seed_hosts: ["172.18.1.21:9301","172.18.1.21:9302","172.18.1.21:9303"]
cluster.initial_master_nodes: ["172.18.1.21"]
EOF
docker run --name elasticsearch-node-${port} \
-p 920${port}:920${port} -p 930${port}:930${port} \
--network=mynet --ip 172.18.1.2${port} \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v
/mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/master-${port}/plugins:/usr/shrae/elasticsearch/plugins \
-d elasticsearch:7.4.2
done
准备三个Node节点
for port in $(seq 1 3); \
do \
mkdir -p /mydata/elasticsearch/master-${port}/config
mkdir -p /mydata/elasticsearch/master-${port}/data
chmod -R 777 /mydata/elasticsearch/master-${port}
cat <<EOF>/mydata/elasticsearch/master-${port}/config/elasticsearch.yml
cluster.name: my-es
node.name: es-master-${port}
node.master: false
node.data: true
network.host: 0.0.0.0
http.host: 0.0.0.0
http.port: 920${port}
transport.tcp.port: 930${port}
discovery.zen.ping_timeout: 10s
discovery.seed_hosts: ["172.18.1.21:9301","172.18.1.21:9302","172.18.1.21:9303"]
cluster.initial_master_nodes: ["172.18.1.21"]
EOF
docker run --name elasticsearch-node-${port} \
-p 920${port}:920${port} -p 930${port}:930${port} \
--network=mynet --ip 172.18.1.2${port} \
-e ES_JAVA_OPTS="-Xms300m -Xmx300m" \
-v
/mydata/elasticsearch/master-${port}/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/master-${port}/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/master-${port}/plugins:/usr/shrae/elasticsearch/plugins \
-d elasticsearch:7.4.2
done
2.3.5 rabbitmq集群搭建
mkdir /mydata/rabbitmq
cd rabbitmq/
mkdir rabbitmq1 rabbitmq01 rabbitmq03
docker run -d --hostname rabbitmq01 --name rabbitmq01 -v /mydata/rabbitmq/rabbitmq01:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' rabbitmq:management
docker run -d --hostname rabbitmq02 --name rabbitmq02 -v /mydata/rabbitmq/rabbitmq02:/var/lib/rabbitmq -p 15675:15672 -p 5675:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' --link rabbitmq01:rabbitmq01 rabbitmq:management
docker run -d --hostname rabbitmq03 --name rabbitmq03 -v /mydata/rabbitmq/rabbitmq03:/var/lib/rabbitmq -p 15678:15672 -p 5678:5672 -e RABBITMQ_ERLANG_COOKIE='zjx' --link rabbitmq01:rabbitmq01 --link rabbitmq02:rabbitmq02 rabbitmq:management
2.4 启动停止命令
2.4.1 docker start xxx
2.4.2 docker stop myrunoob
2.4.3 docker restart myrunoob
2.5 构建命令
2.5.1 docker build
2.5.1.1 编写Dockerfile
FROM nginx
MAINTAINER zhaojiaxu
ADD html.tar.gz /usr/share/nginx/html
ADD conf.tar.gz /etc/nginx
EXPOSE 80
ENTRYPOINT nginx -g "daemon off;"
FROM java:8
EXPOSE 8080
VOLUME /tmp
ADD target/*.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","-Xms128m","-Xmx300m","/app.jar","--spring.profiles.active=prod"]
2.5.1.2 构建本地docker镜像
docker build -f Dockerfile -t $REGISTRY/$ALIYUNHUB_NAMESPACE/$PROJECT_NAME:SNAPSHOT-$BRANCH_NAME-$BUILD_NUMBER .’
参数
OPTIONS说明:
- —build-arg=[] :设置镜像创建时的变量;
- —cpu-shares :设置 cpu 使用权重;
- —cpu-period :限制 CPU CFS周期;
- —cpu-quota :限制 CPU CFS配额;
- —cpuset-cpus :指定使用的CPU id;
- —cpuset-mems :指定使用的内存 id;
- —disable-content-trust :忽略校验,默认开启;
- -f :指定要使用的Dockerfile路径;
- —force-rm :设置镜像过程中删除中间容器;
- —isolation :使用容器隔离技术;
- —label=[] :设置镜像使用的元数据;
- -m :设置内存最大值;
- —memory-swap :设置Swap的最大值为内存+swap,”-1”表示不限swap;
- —no-cache :创建镜像的过程不使用缓存;
- —pull :尝试去更新镜像的新版本;
- —quiet, -q :安静模式,成功后只输出镜像 ID;
- —rm :设置镜像成功后删除中间容器;
- —shm-size :设置/dev/shm的大小,默认值是64M;
- —ulimit :Ulimit配置。
- —squash :将 Dockerfile 中所有的操作压缩为一层。
- —tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- —network: 默认 default。在构建期间设置RUN指令的网络模式


前置条件
2.5.1.3 登录阿里云镜像账号密码
docker login —username=刘次生气了 registry.cn-qingdao.aliyuncs.com
2.5.1.4 给镜像打标签
docker tag [ImageId] registry.cn-qingdao.aliyuncs.com/meyes/zjx:[镜像版本号]
2.5.1.5 推送的远程阿里云镜像仓库地址
docker push registry.cn-qingdao.aliyuncs.com/meyes/zjx:[镜像版本号]
2.5.2 docker commit
从容器创建新的镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
- -a :提交的镜像作者;
- -c :使用Dockerfile指令来创建镜像;
- -m :提交时的说明文字;
- -p :在commit时,将容器暂停。
-
2.6 进入命令
2.6.1 docker exec -it xxx /bin/bash
参数
OPTIONS说明: -d :分离模式: 在后台运行
- -i :即使没有附加也保持STDIN 打开
- -t :分配一个伪终端
2.6.2 分享一个容器操作失败案例
内容场景为,因为服务器容器mysql没有把配置文件挂载出来,本人想进入容器进行配置文件修改,把mysql连接回收时间设置为最大值
docker容器内安装vim命令
apt-get update
apt-get install vim -y
apt-get install yum -y

个人把 ! 去掉了,个人因为是它排除了这些文件夹下的配置文件,容器再次启动,启动不起来,这时候容器配置文件没有挂载出来,容器在没有启动的状态下是进不去容器内部修改文件的,
首先docker ps,查看container id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
daa516dadd07 tensorflow/tensorflow:latest-gpu-py3 “/bin/bash” 6 minutes ago Up 6 minutes 6006/tcp, 8888/tcp root-triple-xi
然后拷贝
docker cp docker-id:/origin-path /destination-path/
e.g. docker cp a9eedbbc0d43:/notebooks/ground_truth.txt /home/xi/git/triple-xi/
完成



