

Docker笔记
安装 Docker
方式一:
一般云服务厂商都有提供 Docker 应用系统镜像,直接选择该应用系统镜像即可
方式二:
# 环境安装:
yum -y install gcc-c++
# 第一步:安装必要的一些系统工具
yum install -y yum-utils device-mapper-persistent-data lvm2
# 第二步:添加软件源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 第三步:更新并安装Docker-CE
yum makecache fast
yum -y install docker-ce
# 第四步:开启Docker服务
service docker start
# 第五步、测试是否安装成功
docker -v
# 可选
# 第六步:配置镜像加速器
# 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
# 下面的所有命令可以一起复制粘贴
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ldu6wrsf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
常用命令
docker ps
查看当前运行中的容器
docker ps -a
查看 Docker 所有容器,包括未运行状态的
docker images
查看镜像列表
docker start 容器id
启动容器
docker restart 容器id
重启容器
stop/kill
停止/强制停止容器
rm
删除容器
rmi
删除镜像
rm -f
强制删除容器
- run 命令参考:https://docs.docker.com/engine/reference/commandline/run/ (官方)
- 或 https://www.runoob.com/docker/docker-run-command.html(中文)
- Docker 所有命令参考:https://www.runoob.com/docker/docker-command-manual.html
设置 Docker 容器自启动
首先保证 Docker 开机自启动
systemctl enable docker
设置 Docker 容器自启动有两种方式
方式一:创建容器时追加参数:--restart=always
方式二:update 已有容器:docker update --restart=always 容器id
--restart具体参数值详细信息:
no // 默认策略,容器退出时不重启容器;
on-failure // 在容器非正常退出时(退出状态非0)才重新启动容器;
on-failure:3 // 在容器非正常退出时重启容器,最多重启3次;
always // 无论退出状态是如何,都重启容器;
unless-stopped // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
查看 Docker 是否开机自启:systemctl is-enable docker
启动 Docker:systemctl start docker
停止 Docker:systemctl stop docker
重启 Docker:systemctl restart docker 一般宿主机的防火墙状态发生改变后,最好重启一下 Docker
通过运行 hello-world 镜像来验证是否正确安装了 Docker Engine-Community :docker run hello-world
查看 Docker 版本:docker -v
迁移与备份
容器保存为镜像
docker commit 容器id 镜像名称
例如:docker commit mynginx mynginx_i
镜像备份
我们可以通过以下命令将镜像保存为 tar 文件
docker sava -o xxx.tar 镜像名称
其中xxx 为文件名,-o 表示 output 输出。例如:docker sava -o mynginx.tar mynginx_i
镜像迁移与恢复
我们可以通过以下命令通过本地 tar 文件导入镜像
docker load -i xxx.tar
例如:docker load -i mynginx.tar
Docker 私有仓库(待整理)
根据 Docker 课程,与云原生课程整理
打包 Java 应用
方式一:通过 IDEA 快速构建镜像并运行
① 编写 Dockerfile
FROM openjdk:8-jdk-slim
LABEL maintainer=kuangyang
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
② 设置镜像 tag 与运行参数

③ 运行或构建镜像
点击 FROM 右侧 run 按钮,选择运行
或构建镜像
运行
是指 构建镜像 + 创建容器并运行
构建镜像
是指 仅仅构建镜像
方式二:通过 Docker 环境构建镜像并运行
① 编写 Dockerfile
FROM openjdk:8-jdk-slim
LABEL maintainer=kuangyang
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
② 构建镜像
# 注意最后的空格和点,不能省略
docker build -t java-demo:1.0 .
③ 启动容器
docker run --name my-javademo -d -p 8080:8080 java-demo:1.0
补充一:查看容器运行 logs
docker logs my-javademo
补充二:Dockerfile 常用命令

Docker Compose(待学习)
https://www.bilibili.com/video/BV1gr4y1U7CY
Portainer (待学习)
https://www.bilibili.com/video/BV1gr4y1U7CY
CIG(待学习)
https://www.bilibili.com/video/BV1gr4y1U7CY
安装 MySQL 5.7
拉取MySQL5.7的镜像
sudo docker pull mysql:5.7
创建运行一个实例
docker run --name mysql5 -p 3305:3306 -e MYSQL_ROOT_PASSWORD=abc123 -d mysql:5.7 --character_set_server=utf8mb4 --collation_server=utf8mb4_unicode_ci
参数说明
--name mysql5
设置新容器的名字为 mysql5
-p 3305:3306
设置端口映射,格式为:主机(宿主)端口:容器端口,这里即,将计算机3305端口映射到容器的3306端口
-e MYSQL\_ROOT\_PASSWORD=abc123
设置环境变量,将root用户的密码设为abc123
-d
后台运行容器,并返回容器ID
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
设置数据库默认的字符集和排序规则
如果出现乱码问题,针对 MySQL 5 可以使用
SHOW VARIABLES LIKE '%char%';
查看character_set_server
的编码
若创建容器时忘记设置编码:
a. 容器删了重建
b. 进入容器,执行echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf
若执行echo "character-set-server=utf8" >> /etc/mysql/mysql.conf.d/mysqld.cnf
更改编码时提示找不到文件或目录可以将这句命令复制粘贴到记事本,重新打一下符号,空格等,因为一般是编码问题
安装 MySQL 8
# 拉取 MySQL8 镜像
docker pull mysql:8.0
# 查看镜像
docker images
# 运行容器
docker run -p 3306:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=abc123 -d mysql:8.0 --default_authentication_plugin=mysql_native_password
# 其中环境参数是为了修改 MySQL8 的默认认证策略,避免连接时出现
# 2059 - Authentication plugin 'caching_ sha2_ password' cannot be loaded:找不到指定的模块。
安装 Oracle11g
拉取镜像
- 注意该镜像大约6.85GB
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
查看镜像
docker images
启动容器(默认方式)
docker run -d -p 1521:1521 --name oracle_11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
持久化启动方式如下:(可选)(特殊场景)(UN)
docker run -d -it -p 1521:1521 --name oracle_11g --restart=always --mount source=oracle_vol,target=/home/oracle/app/oracle/oradata registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
一般用默认启动方式就可以了,若是需要将数据保存到本地的采用持久化方式
–mount
表示要将Host上的路径挂载到容器中
source=oracle_vol
为Host的持久化卷,若未提前创建会自动创建,可通过docker volume instpect 【容器名】查看volume的具体位置,target为容器中的路径
查看容器
- 容器状态up表示在运行状态
docker ps
进入容器
docker exec -it oracle_11g bash
切换到root账户
- 默认进入之后是oracle账户
su - root
密码
helowin
编辑环境变量
vi /etc/profile
输入i开始编辑,在最后一行后添加以下内容:
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
添加完后 按esc键
一下,输入 :qw
保存并退出,然后输入以下命令使配置生效:
source /etc/profile
注意:macOS Vim
esc键
可能失效,解决方案:按ctrl + c
创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
切换回 oracle 用户
su - oracle
登录sqlplus
sqlplus /nolog
conn /as sysdba
修改 sys、system 用户密码
alter user system identified by YOUR_PASSWORD;
alter user sys identified by YOUR_PASSWORD;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
默认密码是
helowin
创建用户(可选,根据需要)
- 创建一个具有dba权限的用户(sysdba)
create user YOUR_NAME identified by YOUR_PASSWORD;
grant connect,resource,dba to YOUR_NAME;
连接测试
安装 MongoDB
# 1、拉取镜像
docker pull mongo:4.4.8
# 查看拉取的镜像
docker images
# 2、创建和启动容器
# 针对个人电脑
docker run --name my-mongo -d -p 27017:27017 -v /Users/kuangyang/docker-v/mongo/data/db:/data/db -d mongo:4.4.8
# 针对 Linux 服务器
#(1)对data目录授权
chmod 777 data
#(2)创建和启动容器
docker run -d --restart=always -p 27017:27017 --name my-mongo -v /data/db:/data/db -d mongo:4.4.8
# 3、进入容器
docker exec -it my-mongo /bin/bash
# 4、使用 MongoDB 客户端进行操作
mongo
> show dbs # 查询所有的数据库
安装 Redis
# 拉取最新 redis 镜像
docker pull redis
# 查看拉取的镜像
docker images
# 创建一个实例
# ① 若不需要设置目录挂载
docker run --name my-redis -d -p 6379:6379 redis
# ② 若不需要设置目录挂载,但需要持久化数据
# 有几种不同的持久性策略可供选择。此选项将每 60 秒保存一次数据库快照(它也会导致更多日志,因此该loglevel选项可能是可取的)。如果启用了持久性,则数据存储在 /data
# 有关 Redis 持久性的更多信息,请参阅http://redis.io/topics/persistence
docker run --name my-redis -d -p 6379:6379 redis redis-server --save 60 1 --loglevel warning
# ③ 若需要设置目录挂载
docker run --name my-redis -d -p 6379:6379 -v /Users/kuangyang/docker-v/redis/redis.conf:/usr/local/etc/redis/redis.conf -v /Users/kuangyang/docker-v/redis/data:/data redis redis-server /usr/local/etc/redis/redis.conf
# 查看运行中的容器
docker ps
redis.conf 参考(6):
https://www.runoob.com/redis/redis-conf.html
安装 Nacos
# 第一步:拉取镜像
docker pull nacos/nacos-server:v2.1.2-slim
# 第二步:启动
docker run -e MODE=standalone --name my-nacos -d -p 8848:8848 -e JVM_XMS=512m -e JVM_XMX=512m nacos/nacos-server:v2.1.2-slim
了解更多信息:
https://hub.docker.com/r/nacos/nacos-server
docker run -d \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.6.103 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
-e MYSQL_SERVICE_DB_NAME=nacos \
-p 8848:8848 \
--name nacos \
--restart=always \
nacos/nacos-server:1.4.1
安装 Sentinel Dashboard
# 第一步:拉取镜像
docker pull bladex/sentinel-dashboard
# 第二步:启动
docker run --name sentinel-dashboard -p 8858:8858 -d bladex/sentinel-dashboard:latest
安装 Elasticsearch
# 第一步:拉取镜像
docker pull elasticsearch:7.8.0
# Linux
# 第二步:启动
需要建立:两个文件夹
mkdir -p /mydata/elasticsearch/plugins
mkdir -p /mydata/elasticsearch/data
授予权限 chmod 777 /mydata/elasticsearch/data
docker run -p 9200:9200 -p 9300:9300 --name my-elasticsearch --restart=always \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-d elasticsearch:7.8.0
# Mac
# 第二步:启动
docker run -p 9200:9200 -p 9300:9300 --name my-elasticsearch \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-d elasticsearch:7.8.0
# 第三步:安装中文分词器
1.下载elasticsearch-analysis-ik-7.8.0.zip
<https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.8.0>
2.上传解压:unzip elasticsearch-analysis-ik-7.8.0.zip -d ik-analyzer
3.上传到es容器:docker cp ./ik-analyzer my-elasticsearch:/usr/share/elasticsearch/plugins
4.重启es:docker restart my-elasticsearch
安装 Kibana
# 第一步:拉取镜像
docker pull kibana:7.8.0
# 第二步:启动
docker run --name kibana -e ELASTICSEARCH_URL=http://elasticsearch:9200 -p 5601:5601 -d --link my-elasticsearch:elasticsearch kibana:7.8.0
进入容器修改:docker exec -it kibana /bin/bash
cd config
vi kibana.yml
最后一行追加:
i18n.locale: zh-CN
docker restart kibana 重启kibana
测试:安装分词词库是否可以使用!
GET /.kibana/_analyze
{
"text": "我是中国人",
"analyzer": "ik_max_word"
}
安装 Logstash
# 第一步:拉取镜像
docker pull logstash:7.8.0
# 提前准备配置文件 /mydata/logstash/logstash.conf (也可以容器启动后再修改)
# Linux
mkdir -p /mydata/logstash
cd /mydata/logstash
vi logstash.conf
内容:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json_lines
}
}
filter{
}
output {
elasticsearch {
hosts => "es:9200"
index => "gmall-%{+YYYY.MM.dd}"
}
}
# 第二步:启动
# ① 若提前准备了配置文件
docker run --name logstash -p 5044:5044 --link my-elasticsearch:es -v /mydata/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf -d logstash:7.8.0
# ② 若提前没有准备配置文件,打算创建容器后再修改(推荐)
docker run --name logstash -p 5044:5044 --link my-elasticsearch:elasticsearch -d logstash:7.8.0
# 修改配置文件
docker exec -it logstash /bin/bash
cd pipeline
vi logstash.conf
全部内容:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 5044
codec => json_lines
}
}
filter{
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "gmall-%{+YYYY.MM.dd}"
}
}
重启容器
docker restart logstash
安装 Zipkin
# 第一步:拉取镜像
docker pull openzipkin/zipkin
# 第二步:启动
docker run --name zipkin -d -p 9411:9411 openzipkin/zipkin
安装 MinIO
# 第一步:拉取镜像
docker pull minio/minio
# 第二步:启动
# Linux
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio \
-d --restart=always \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=abc123456" \
-v /home/data:/data \
-v /home/config:/root/.minio \
minio/minio server /data --console-address ":9001"
# Mac
docker run \
-p 9000:9000 \
-p 9001:9001 \
--name minio -d \
-e "MINIO_ROOT_USER=admin" \
-e "MINIO_ROOT_PASSWORD=abc123456" \
minio/minio server /data --console-address ":9001"
浏览器访问:http://IP:9001
安装 Nginx
拉取最新版的 Nginx 镜像
docker pull nginx:latest
或docker pull nginx
,因为默认就是最新版
查看当前所有镜像
docker images
准备本地映射目录
映射目录为:/Users/kuangyang/docker-nginx
需要至少将 nginx.conf
与 default.conf
准备好
- nginx.conf 示例
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
#监听的端口
listen 80;
#监听的域名
server_name manage.ego.com;
#转发头信息
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#请求映射规则,/表示映射一切请求路径
location / {
#代理转发到
proxy_pass http://192.168.0.232:9001;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
server {
listen 80;
server_name api.ego.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://192.168.0.232:10010;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
}
- default.conf 示例
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include 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 logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
运行 Nginx 容器
docker run --name nginx -p 80:80 -v /Users/kuangyang/docker-v/docker-nginx/www:/www -v /Users/kuangyang/docker-v/docker-nginx/nginx.conf:/etc/nginx/nginx.conf -v /Users/kuangyang/docker-v/docker-nginx/log:/var/log/nginx -v /Users/kuangyang/docker-v/docker-nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -d nginx
参数说明:
-d
:设置容器在在后台一直运行
安装 Tomcat
# 拉取最新 tomcat 镜像
docker pull tomcat
# 查看拉取的镜像
docker images
# 创建一个实例
docker run --name=mytomcat -d -p 8080:8080 -v /Users/kuangyang/docker-v/docker-tomcat/webapps:/usr/local/tomcat/webapps tomcat
# 查看运行中的容器
docker ps
# 在 webapps 中创建一个文件夹,再创建一个 html 测试是否完成安装
安装 RabbitMQ
# 拉取 RabbitMQ 最新镜像
docker pull rabbitmq
# 运行一个实例
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 rabbitmq
# 或:更推荐,在创建容器实例时即指定默认用户名与密码,这样不会创建 guest 账户,并且默认账户拥有所有权限
docker run --name rabbitmq -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=abc123 rabbitmq
# 进入容器
docker exec -it 容器id /bin/bash
# 安装 Web 界面插件
rabbitmq-plugins enable rabbitmq_management
安装完成后,使用浏览器访问 http://127.0.0.1:15672,
默认的 guest 账户的用户名和密码都是guest。
# 若通过方式二创建的容器则无须下面的步骤
# 默认的 guest 账户有访问限制,默认只能通过本地网络(如 localhost) 访问,远程网络访问受限。
# 所以在使用时我们一般另外添加用户,例如我们添加一个root用户。
# 添加用户,用户名为root,密码为abc123
rabbitmqctl add_user root abc123
# 赋予 root 用户所有权限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
# 赋予 root 用户 administrator 角色
rabbitmqctl set_user_tags root administrator
# 查看所有用户,即可看到 root 用户已经添加成功
rabbitmqctl list_users
接着返回浏览器登录 root 用户测试是否正常
# 修复没有查看 Channels 的权限:Stats in management UI are disabled on this node
cd /etc/rabbitmq/conf.d/
# 修改 management_agent.disable_metrics_collector = false
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf
# 退出容器
exit
# 重启 RabbitMQ
docker restart 容器id
重启完成后登录 root 用户,测试是否能查看 Channels
# 若通过方式二创建的容器则无须下面的步骤
# 删除 guest 用户
# 再次进入容器
docker exec -it 容器id /bin/bash
# 执行删除
rabbitmqctl delete_user guest
# 查看所有用户,没有 guest 则删除成功
rabbitmqctl list_users
# 安装延时队列插件
# 下载
首先前往官网下载 https://www.rabbitmq.com/community-plugins.html
插件:rabbitmq_delayed_message_exchange
# 将下载的插件文件 copy 到 RabbitMQ 的插件文件夹
# 提示:在下载文件所在目录执行这条命令
docker cp 文件名 容器id:/plugins
# 进入容器确认是否 copy 成功
docker exec -it 容器id /bin/bash
ls
cd plugins
ls
# 若看到刚刚复制的文件,则开始执行安装插件
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
# 提示 The following plugins have been configured: 则安装成功
# 重启 RabbitMQ
docker restart 容器id
最后在 web 管理页面,创建交换机时 Type 有 x-delayed-message 即可。
# 注:
通过延时队列插件实现延迟队列靠的是这种延迟交换机,
通过死信队列实现延迟队列靠的是队列,RabbitMQ 在队列只会检查第一个消息是否过期,所以会存在消息不会按时“死亡”问题。
感谢您的支持,我会继续努力的!


扫码打赏,你说多少就多少
打开微信扫一扫,即可进行扫码打赏哦