docker
一、linux安装docker
(使用root权限,如果不是,每个命令前加sudo)
1. ubuntu安装docker
卸载ubuntu原装docker
1
apt-get remove docker docker-engine docker.io containerd runc
更新软件包和版本数据:
1
2
3
4# 1
apt-get update
# 2
apt upgrade安装docker所需的依赖文件
1
apt-get install ca-certificates curl gnupg lsb-release
添加docker官方GPG密钥:
1
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
添加docker国内镜像源(此处选用阿里云):
1
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
安装docker
1
apt-get install docker-ce docker-ce-cli containerd.io
docker 启动
1
systemctl start docker
安装工具:
1
2# 为apt添加了https 支持
apt-get -y install apt-transport-https ca-certificates curl software-properties-common重启
1
2
3service docker restart
# 或
systemctl restart docker设置开机自启
1
systemctl enable docker.service
2. centos安装docker
清除旧版本:
1
2
3
4
5
6yum remove docker \
docker-client \
docker-client-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine安装gcc相关:
1
2yum -y install gcc
yum -y install gcc-c++设置仓库:
1
2
3
4先安装yum-utils
yum install -y yum-utils
设置(阿里云)仓库地址
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新yum软件包索引:
yum makecache fast
安装docker引擎:
yum -y install docker-ce docker-ce-cli containerd.io
启动:
systemctl start docker
3. 配置镜像加速器
ubuntu或centos都可用以下方式配置镜像加速器
登录阿里云官网,搜索容器镜像服务
进入后在镜像工具-镜像加速器下复制自己的加速器地址,在linux中配置镜像加速器地址
1
2
3
4
5
6
7
8sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["【填写个人地址】"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
4. 补充:安装配置docker compose
下载
1
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
配置权限
1
chmod +x /usr/local/bin/docker-compose
查看版本
1
docker-compose version
卸载
1
rm /usr/local/bin/docker-compose
二、docker基本命令
1. 帮助启动类命令
- 防火墙状态:
ufw status
- 关闭或开启防火墙:
- ubuntu:
ufw enable/disable
- centos:
systemctl enable/disable firewalld
- ubuntu:
- 开放及关闭端口:
- ubuntu:
ufw [delete] allow 【端口号】
- centos:
firewall-cmd --zone=public --add/remove-port=【端口号】/tcp --permanent
- ubuntu:
- 启动docker:
systemctl start docker
- 停止docker:
systemctl stop docker
- 重启docker:
systemctl restart docker
- 查看docker状态:
systemctl status docker
- 是否开机自启:
systemctl enable/disable docker
- 查看版本:
docker version
- 查看概要信息:
docker info
- 查看总体帮助文档:
docker --help
- 查看docker命令帮助文档:
docker 具体命令 --help
2. 镜像命令
- 展示镜像:
docker images
- 查询镜像:
docker search 【镜像名】
- 拉取镜像:
docker pull 镜像名[:版本] # 默认版本是latest
- 删除镜像:
docker rmi [-f] 镜像名称或镜像id # -f表示强制删除
3. 容器命令
创建容器:
docker run [-d -v -p --name --restart……] 镜像名:版本
-v:数据挂载
-d:后台启动
-p:端口映射
6379:6379
表示左边为暴露的端口,右边为容器端口–name:自定义容器名
–restart:开机是否自启
-it:启动交互式容器
显示已启动的容器:
docker ps
显示所有容器:
docker ps -a
进入容器:
docker exec -it 【容器名或id】 /bin/bash【或bash】
退出容器:
exit
删除容器:
docker rm 【容器名称/容器id(可只写一部分)】 # 可加-f参数强制删除
设置容器开机自启:
docker update --restart=always 【容器名称或id】
关闭开机自启:
docker update --restart=no 【容器名称或id】
启动容器:
docker start 容器名/容器id(可部分)
重启容器:
docker restart 容器名/容器id(可部分)
关闭容器:
docker start 容器名/容器id(可部分)
查看日志:
docker logs 【容器名或id】
复制容器文件到本地系统文件,防止容器删除后数据也没了:
docker cp 【容器id(可只写一部分):文件位置】 本地位置
导入导出容器:
- 导出容器的内容留作为一个tar归档文件:
docker export 【容器id】 > abc.tar
- 从tar包中的内容创建一个新的文件系统再导入为镜像:
cat abc.tar | docker import - 镜像用户/镜像名:镜像版本号
- 导出容器的内容留作为一个tar归档文件:
三、docker安装镜像及启动容器
1. docker 安装mysql
拉取镜像:
1
docker pull mysql 默认拉取最新版,可在后边加上':5.7'指定5.7版本
启动容器,做好端口映射、数据挂载(放置容器删除后数据也被删除)
1
2
3
4
5
6
7
8docker run -d -p 3306:3306 --privileged=true \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql \
--update always \
mysql:latest设置字符集为utf8
1
2cd /mydata/mysql/conf
vim my.cnf编辑内容为:
1
2
3
4
5[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8重启mysql
1
docker restart mysql
2. docker安装emqx
拉取
1
docker pull emqx/emqx
运行容器
1
docker run -p 18083:18083 -p 8883:8883 -p 8083:8083 -p 8084:8084 -p 1883:1883 --name=emqx -d emqx/emqx
3. docker安装rtmp
拉取(nginx和rtmp的整合包,rtmp是流媒体协议,用于直播等)
1
docker pull alqutami/rtmp-hls
运行
1
docker run -p 1935:1935 -p 8080:8080 --name=nginx_rtmp -d alqutami/rtmp-hls
拷贝文件
1
docker cp 容器id:/etc.nginx /mydata
将mydata下的nginx文件修改名称为nginx_rtmp:直接在图形界面上编辑
运行
1
2
3
4docker run -p 1935:1935 -p 8080:8080 \
-v /mydata/nginx_rtmp:/etc/nginx \
--name nginx_rtmp \
-d alqutami/rtmp-hls
4. docker安装nginx
拉取
1
docker pull nginx
运行
1
2
3
4
5docker run -p 80:80 --name nginx --restart=always \
-v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-d nginx:latest
5. docker安装kafka
创建一个网络
1
docker network create app-tier --driver bridge
安装zookeeper(kafka依赖zookeeper)
1
2
3
4
5docker run -d --name zookeeper-server \
--network app-tier \
-e ALLOW_ANONYMOUS_LOGIN=yes \
--restart always \
bitnami/zookeeper:latest安装kafka
1
2
3
4
5
6
7
8docker run -d --name kafka-server \
--network app-tier \
-p 9092:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://【主机ip】:9092 \
--restart always \
bitnami/kafka:latestkafka-map图形化管理工具
1
2
3
4
5
6
7docker run -d --name kafka-map \
--network app-tier \
-p 9001:8080 \
-v /mydata/kafka-map/data:/usr/local/kafka-map/data \
-e DEFAULT_USERNAME=admin \
-e DEFAULT_PASSWORD=admin \
--restart always dushixiang/kafka-map:latest- 访问地址:http://服务器IP:9001/
- 默认账号密码为:admin
6. docker安装Elasticsearch、Kibana、IK分词器
1. 安装Elasticsearch
创建网络:因为需要部署kibana容器,因此需要让es和kibana容器互联
1
docker network create es-net
拉取镜像 jdk8不能使用6以上的版本
1
docker pull elasticsearch:7.12.1
创建挂载点目录
1
2
3
4mkdir -p /mydata/es/data /mydata/es/config /mydata/es/plugins
chmod 777 /mydata/es/data
chmod 777 /mydata/es/config
chmod 777 /mydata/es/plugins部署单点es,创建es容器
1
2
3
4
5
6
7
8
9
10
11
12docker run -d \
--restart=always \
--name es \
--network es-net \
-p 9200:9200 \
-p 9300:9300 \
--privileged \
-v /mydata/es/data:/usr/share/elasticsearch/data \
-v /mydata/es/plugins:/usr/share/elasticsearch/plugins \
-e "discovery.type=single-node" \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
elasticsearch:7.12.1验证是否安装成功
2. 安装Kibana
拉取镜像
1
docker pull kibana:7.12.1
创建容器
1
2
3
4
5
6
7docker run -d \
--restart=always \
--name kibana \
--network es-net \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
kibana:7.12.1测试是否安装成功
3. 安装ik分词器
进入es容器
1
docker exec -it es /bin/bash
在线安装
___注意:安装IK分词器的版本,必须和Elasticsearch的版本一致___。安装其他版本的将版本号修改即可
1
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip
四、远程连接
使用idea远程连接docker
配置docker远程连接端口
编辑docker 配置文件
vim /lib/systemd/system/docker.service
修改配置
1
2将[Service]下的ExecStart添加 -H tcp://0.0.0.0:2375,如:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
加载配置:
systemctl daemon-reload
重启docker:
systemctl restart docker
开启防火墙或开放2375端口:操作☞上文 docker基本命令
测试远程访问,访问 http://[虚拟机ip]:2375/version,出现展示docker版本的一段json即说明设置成功
idea配置docker连接
- 下载插件docker
- 在设置中找到docker并添加连接
- 点击加号
- 选择TCP socket,添加Engine API URL
- url格式为tcp://【主机地址】:2375,如下图所示
五、本地镜像发布
1. commit命令
拉取ubuntu镜像:
docker pull ubuntu
运行容器,ubuntu不能后台运行,所以直接进入:
docker run -it 【镜像id】 /bin/bash
默认没有vim命令,执行
vim a.txt
会保存vim没有找到下载vim:
1
2apt-get update
apt-get install vim此时再进行测试,发现vim安装成功
提交容器副本使之成为一个新的镜像:本ubuntu已经添加了vim命令,将其提交
1
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
提交之后,执行
docker images
会看到刚才提交的镜像,运行这个镜像,执行vim命令,发现该命令已存在
2.本地镜像发布到阿里云
进入阿里云容器镜像服务,在实例列表中创建个人示例
设置Registry登录密码:
点击命名空间 -> 创建命名空间
点击镜像仓库 ->创建命名空间
填写仓库信息
选择代码源
参照阿里云给出的命令将本地镜像推送到阿里云:
在镜像版本界面就可以看到推送的本地镜像了
3. 从阿里云拉取镜像到本地
参照第二条命令进行拉取
4.本地镜像推送到私有仓库
下载镜像 Docker Registry:
1
docker pull registry
运行私有库Registry,相当于本地有个私有Dockerhub:
1
2
3
4
5docker run -d -p 5000:5000 \
-v /mydata/myregistry:/tmp/registry \
--name=registry \
--restart=always \
--privileged=true registry为拉取的简单版ubuntu添加ifconfig命令
commit:
将新镜像修改符合私服规范的tag:
1
docker tag 镜像名:版本 虚拟机ip:5000/镜像名:版本
修改配置文件使之支持http:
1
2
3
4
5
6vim /etc/docker/daemon.json
# 添加如下配置:
{
"registry-mirrors":["阿里云镜像地址"],
"insecure-registries":["虚拟机ip:5000"]
}重启docker
push到私服库
1
docker push 虚拟机ip:5000/镜像名:版本tag
验证私服库上有什么镜像
1
2
3curl -XGET http://虚拟机ip:5000/v2/_catalog
# 查看镜像tag
curl http://虚拟机ip:5000/v2/镜像名/tags/list拉取镜像
1
docker pull 虚拟机ip:5000/镜像名:版本tag
六、docker高级安装
mysql主从复制
新建主服务器容器实例3307
1
2
3
4
5
6
7docker run -d -p 3307:3306 --privileged=true \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-master \
mysql:5.7进入/mydata/mysql-master/conf目录下下新建my.cnf,修改配置
1
2cd /mydata/mysql-master/conf
vim my.cnf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值是0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062重启master实例
1
docker restart mysql-master
进去mysql-master容器,创建数据同步用户
1
2docker exec -it mysql-master bash
mysql -uroot -p1
2CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';新建从服务器容器示例3308
1
2
3
4
5
6
7docker run -d -p 3308:3306 --privileged=true \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql-slave \
mysql:5.7进入/mydata/mysql-slave/conf目录下下新建my.cnf,修改配置
1
2cd /mydata/mysql-slave/conf
vim my.cnf1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值是0,表示不自动清理
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制终端
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1重启slave示例
1
docker restart mysql-slave
在主数据库查看主从同步状态
1
show master status; #可在最后加'\G'来以k:v形式查看
进入mysql-slave容器
1
2docker exec -it mysql-slave bash
mysql -uroot -p在从数据库中配置主从复制
1
change master to master_host="192.168.60.129",master_user='slave',master_password='123456',master_port=3307,master_log_file="mall-mysql-bin.000001",master_log_pos=617,master_connect_retry=30;
master_host:主数据库的IP地址
master_user:在主数据库创建的用于同步数据的用户账号
master_password:在主数据库创建的用于同步数据的用户密码
master_port:主数据库的运行端口
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数
master_connect_retry:连接失败重试的时间间隔,单位为秒
在从数据库中查看主从同步状态
1
show slave status; #可在最后加'\G'来以k:v形式查看
在从数据库中开启主从同步
1
start slave;
查看从数据库状态发现已经同步
1
show slave status \G;
主从复制测试
在主数据库中创建数据库、表,插入数据,在从数据库中查看是否同步。OVER!