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 强制删除容器

设置 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.confdefault.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 在队列只会检查第一个消息是否过期,所以会存在消息不会按时“死亡”问题。
赞赏