Docker学习
一、概念 😐
Dcoker:
Docker是基于Go语言实现一种轻量级容器虚拟化技术(容器技术)。
镜像(image):
Docker 镜像(Image)是个只读的文件,它支持Docker与宿主机之间的导入,导出,上传,下载。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 就好似 Java 中的 类和对象,类就是镜像,容器就是对象
容器(container):
Docker 容器(Container)相当于独立运行的进程,容器是用镜像创建的运行实例,且各个容器间相互隔离。
二、安装
# 安装docker(三种任选其一)
yum -y install docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
curl -sSL https://get.daocloud.io/docker | sh
# 查看docker版本
docker version
# 添加阿里镜像源
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 刷新配置文件
systemctl daemon-reload
# 启动docker服务
systemctl enable docker && systemctl restart docker
三、命令 😐
① 镜像
# 镜像导入导出命令,点击[查看详情](https://blog.csdn.net/welcome66/article/details/105640242)
# 下载镜像
dokcer pull + image:tag
# 列出本地主机上的镜像
docker images
# 搜索对应DockerHub仓库中的镜像
docker search
# 镜像打标签
docker tag old_image:tag new_image:tag
# 删除镜像
docker rmi -f + 镜像id # 删除单个
docker rmi -f + 镜像名:tag 镜像名:tag # 删除多个
docker rmi -f $(docker images -qa) # 删除全部
② 容器
# 运行容器命令
docker run [OPTIONS] IMAGE [COMMAND][ARG...]
# 常用参数说明
--name="Name" # 给容器指定一个名字
--restart=always # 当 docker 重启时,容器自动启动
--privileged=true # 外部访问可以获取容器内root最高权限
-v 宿主机绝对路径目录:容器内目录 镜像名
-w 容器内的工作目录
-e #设置环境变量
-P # 随机端口映射
-p hostPort:containerPort # 指定端口映射
-d # 后台方式运行容器,并返回容器的id!
-i # 以交互模式运行容器,通过和 -t 一起使用
-t # 给容器重新分配一个终端,通常和 -i 一起使用
# 查看正在运行的容器
doker ps
# 查看正在运行的容器+历史运行的容器
docker ps -a
# 进入正在运行的容器
docker exec -it + 容器id/容器名 /bin/bash
# 退出当前容器
exit # 容器不停止退出
eitxexit # 容器停止退出
# 容器启动停止重启
docker start + 容器id / 容器名
docker restart + 容器id / 容器名
docker stop + 容器id / 容器名
docker kill + 容器id / 容器名
# 删除容器
docker rm -f + 容器id # S删除指定容器
docker rm -f $(docker ps -a -q )# 删除所有容器
③ 其他
# 查看日志
docker logs + 容器名
-t # 显示时间戳
-f # 打印最新的日志
--tail # 数字 显示多少条!
# 查看容器的进程信息
docker top + 容器id
# 查看镜像/容器的元数据
docker inspect +镜像/容器
# 从容器内拷贝文件到宿主
docker cp 容器id:容器内路径 宿主机路径
# 通过Dockerfile 创建容器
cd /jar和Dockerfile包所在目录/
docker build -t + 新的容器名 .
四、构建容器
1. 安装Mysql
# 创建宿主机挂载目录
mkdir -p /usr/local/docker/mysql8.0.29/data
mkdir -p /usr/local/docker/mysql8.0.29/log
vim /usr/local/docker/mysql8.0.29/conf/my.cnf
# 下载 Mysql镜像
docker pull mysql:8.0.29
# 构建Mysql容器
docker run \
--name mysql \
--restart=always \
-p 3306:3306 \
-v /usr/local/docker/mysql8.0.29/log:/var/log/ \
-v /usr/local/docker/mysql8.0.29/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:8.0.29
# 查看容器是否运行
docker ps
# 打印redis容器日志
docker logs mysql
# 进入mysql容器内部
docker exec -it mysql /bin/bash
# 登录mysql
mysql -uroot -proot
# mysql授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
# 刷新
FLUSH PRIVILEGES;
注意事项: mysql8.0.29可能出现容器内可以连接mysql数据库,用navicat连不上的情况,需要改数据库密码
# 查看用户信息
select host,user,plugin,authentication_string from mysql.user;
# 修改数据库密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ycw123129';
2.安装oracle
#下载oracle数据库镜像
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
#下载完成后,查看镜像
docker images
#创建容器
docker run -d -p 1521:1521 --name oracle registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
#进入容器内部
docker exec -it oracle /bin/bash
#切换到root用户下
su root
输入密码:helowin
#配置环境变量
打开:vi /etc/profile ,在文件最后写上下面内容:
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
#刷新加载环境变量
source /etc/profile
#创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
#切换到oracle用户下
su - oracle
这里还要说一下,一定要写中间的内条 - 必须要,否则软连接无效
#进行软连接
sqlplus /nolog
#登录sqlplus并修改sys、system用户密码
sqlplus /nolog --登录
conn /as sysdba --
alter user system identified by system;--修改system用户账号密码;
alter user sys identified by system;--修改sys用户账号密码;
create user test identified by test; -- 创建内部管理员账号密码;
grant connect,resource,dba to test; --将dba权限授权给内部管理员账号和密码;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; --修改密码规则策略为密码永不过期;(会出现坑,后面讲解)
alter system set processes=1000 scope=spfile; --修改数据库最大连接数据;
3. 安装Redis
# 创建宿主机挂载目录
mkdir -p /usr/local/docker/redis/conf
mkdir -p /usr/local/docker/redis/data
# 下载redis镜像
docker pull redis:7.0
# 查看已下载镜像
docker images
# 下载配置文件
wget http://download.redis.io/redis-stable/redis.conf
# 修改配置
1. bind 127.0.0.1 # 注释掉这部分,这是限制redis只能本地访问
2. protected-mode no # 默认yes,开启保护模式,限制为本地访问
3. daemonize no # 默认no,如果改为yes意为以守护进程方式启动,可后台运行,除非 kill进程,改为yes会使配置文件方式启动redis失败
4. repl-diskless-sync-max-replicas 1 # 默认为0,主从集群副本数量
5. databases 16 # 数据库个数(可选),我修改了这个只是查看是否生效。
6. dir ./ # 输入本地redis数据库存放文件夹(可选)
7. requirepass ycw123129 # 设置redis数据库密码
# 创建redis容器
docker run -p 6379:6379 \
--name redis \
--restart=always \
--privileged=true \
-v /usr/local/docker/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /usr/local/docker/redis/data:/data \
-d redis:7.0 \
redis-server /etc/redis/redis.conf \
--appendonly yes
ps:
appendonly yes # 开启redis持久化
redis-server /usr/local/etc/redis/redis.conf # 启动redis服务
# 查看容器是否运行
docker ps
# 打印redis容器日志
docker logs redis
# 进入redis容器内部
docker exec -it redis /bin/bash
# 使用密码验证登陆
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a 123129
4. 安装mongo
# 拉取镜像
docker pull mongo
# 挂载目录
mkdir -p /usr/local/docker/mongo/data
# 运行容器
docker run \
--name mongodb \
--restart always \
--privileged=true \
-p 27017:27017 \
-v /usr/local/docker/mongo/data:/data/db \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123 \
-d mongo mongod --auth
# 打印mongo容器日志
docker logs mongo
-d: 后台运行容器;
--name: 指定容器名;
-p: 指定服务运行的端口;
-v: 映射目录或文件;
--privileged 拥有真正的root权限
--restart=always Docker服务重启容器也启动
-e MONGO_INITDB_ROOT_USERNAME=admin 指定用户名
-e MONGO_INITDB_ROOT_PASSWORD=admin123 指定密码
mongod --auth :容器默认启动命令是mongod,我们认证需要修改启动命为mongod --auth开启认证
5. 安装rabbitmq
# 拉取镜像(带management有web页面)
docker pull rabbitmq:3.9-management
# 挂载目录
mkdir -p /usr/local/docker/rabbitmq/data
# 运行容器
docker run \
--name rabbitmq \
--restart always \
--privileged=true \
--hostname myRabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
-v /usr/local/docker/rabbitmq/data:/var/lib/rabbitmq \
-d rabbitmq:3.9-management
# 打印rabbitmq容器日志
docker logs rabbitmq
# 可以使用浏览器打开web管理端:http://Server-IP:15672
6. 安装elasticsearch
# 创建docker网络
docker network create -d bridge elk
# 从dockerHub中拉取镜像
docker pull elasticsearch:7.16.1
# 启动容器
docker run \
--name elasticsearch \
--restart=always \
-p 9200:9200 \
-p 9300:9300 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-e "discovery.type=single-node" \
-d elasticsearch:7.16.1
mkdir -p /usr/local/docker/elasticsearch/
# copy容器中的文件,到宿主机上
docker cp elasticsearch:/usr/share/elasticsearch/config/ /usr/local/docker/elasticsearch/config/
docker cp elasticsearch:/usr/share/elasticsearch/data/ /usr/local/docker/elasticsearch/data/
docker cp elasticsearch:/usr/share/elasticsearch/logs/ /usr/local/docker/elasticsearch/logs/
docker cp elasticsearch:/usr/share/elasticsearch/plugins/ /usr/local/docker/elasticsearch/plugins/
# 删除容器
docker rm -f 容器id
# 进入从容器里copy出的配置文件夹
cd /usr/local/docker/elasticsearch/config
# 修改elasticsearch.yml配置文件
vim elasticsearch.yml
------------------------------------------
cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
------------------------------------------
# 用xshell把ik分词器解压后的文件复制到宿主机/usr/local/docker/elasticsearch/plugins/ik目录下
注意:应该下载 .zip 的文件,别下载 .gz 的,否则容器启动失败。安装地址https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.16.1
# 启动容器
docker run \
--name elasticsearch \
--restart=always \
--net elk \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms1024m -Xmx2048m" \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-v /usr/local/docker/elasticsearch/config/:/usr/share/elasticsearch/config/ \
-v /usr/local/docker/elasticsearch/data/:/usr/share/elasticsearch/data/ \
-v /usr/local/docker/elasticsearch/logs/:/usr/share/elasticsearch/logs/ \
-v /usr/local/docker/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/ \
-d elasticsearch:7.16.1
# 进入容器
docker exec -it elasticsearch /bin/bash
# 输入命令,按y确认后即可设置密码
elasticsearch-setup-passwords interactive
# 重启elasticsearch,密码生效
docker restart elasticsearch
7. 安装kibana
# 宿主机上新建文件夹
mkdir -p /usr/local/docker/kibana/
# 进入该文件夹,新建kibana.yml配置文件
server.name: kibana
server.host: "0"
elasticsearch.hosts: ["http://es_ip:9200"]
xpack.monitoring.ui.container.elasticsearch.enabled: true
elasticsearch.username: "elastic"
elasticsearch.password: "elastic"
i18n.locale: “zh-CN”
# 从dockerHub中拉取镜像
docker pull kibana:7.16.1
# 启动容器
docker run \
--name kibana \
--restart=always \
--net elk \
-p 5601:5601 \
-v /usr/local/docker/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml \
-d kibana:7.16.1
# 查看kibana容器日志
docker logs kibana
8.安装logstash
# 宿主机上新建文件夹
mkdir -p /usr/local/docker/logstash
# 进入该文件夹,新建logstash.yml配置文件
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
mkdir -p /usr/local/docker/logstash/pipeline
# 进入该文件夹,新建logstash.conf配置文件
input {
tcp {
port => 5000
}
}
## Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "changeme"
}
}
# 拉取镜像
docker pull logstash:7.16.1
# 运行容器
docker run \
--name logstash \
--restart=always \
--net elk \
-p 5000:5000 \
-p 9600:9600 \
-v /usr/local/docker/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml \
-v /usr/local/docker/logstash/pipeline:/usr/share/logstash/pipeline \
-d logstash:7.16.1
# 查看kibana容器日志
docker logs logstash
9. 安装nacos
# 拉取镜像
docker pull nacos/nacos-server:v2.0.4
# 先启动容器导出配置文件
docker cp nacos:/home/nacos/conf/application.properties /usr/local/docker/nacos/conf/
# 修改配置文件配置mysql数据库信息
vim /usr/local/docker/nacos/conf/application.properties
# 启动容器
docker run \
--name nacos -d \
-p 8848:8848 \
--privileged=true \
-Dnacos.standalone=true \
--restart=always \
-e JVM_XMS=256m \
-e JVM_XMX=256m \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-v /usr/local/docker/nacos/logs:/home/nacos/logs \
-v /usr/local/docker/nacos/conf/application.properties:/home/nacos/conf/application.properties \
nacos/nacos-server:v2.0.4
# 此处有坑
1.报错:Client not connected,current status:SHUTDOWN
分析:Nacos的客户端和服务端版本不兼容(如:1.4.2和2.0.3),差异在于新版本添加了Grpc调用,所以启动需要开放端口-p 9848:9848 -p 9849:9849,了解详情请看官方文档
解决:查询Spring Cloud,Alibaba Cloud和Nacos Clint的版本对应关系,统一客户端和服务端版本。
2.报错:failed to req API:/nacos/v1/ns/instance after all servers([10.10.47.74:8848]) tried: java.net.SocketTimeoutException: connect timed out
分析:默认配置了nacos集群。分别启动单个nacos时,会监测 cluster.conf文件中的信息,当其中配置了其他nacos时,若其他未启动,则会出现上述报错!
解决:容器启动添加-Dnacos.standalone=true参数,或者建立nacos集群
10. 安装jenkins
# 下载jenkins镜像
docker search jenkins // 查找jenkins镜像
docker pull jenkins/jenkins // pull jenkins最新镜像
# 安装jdk
mkdir -p /usr/local/docker/jdk
1.下载jdk -> jdk-8u241-linux-x64.tar.gz 移动到 /usr/local/docker/jdk
2.解压安装包 -> tar -zxvf jdk-8u241-linux-x64.tar.gz
# 安装maven
mkdir -p /usr/local/docker/maven
mkdir -p /usr/local/docker/maven/repository
1.下载maven -> apache-maven-3.8.6-bin.tar.gz 移动到 /usr/local/docker/maven
2.解压安装包 -> tar -zxvf apache-maven-3.8.6-bin.tar.gz
3.修改settings.xml配置文件 ->
<localRepository>/var/jenkins_home/maven/repository</localRepository>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
# 创建jenkins挂载目录
mkdir -p /usr/local/docker/jenkins/var/jenkins_home
mkdir -p /usr/local/docker/jenkins/var/bin/docker
mkdir -p /usr/local/docker/jenkins/var/run/docker.sock
# 启动 Jenkins 容器
docker run -u root -d -e TZ="Asia/Shanghai" --name jenkins -p 8888:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home -v /usr/local/docker/jenkins/var/run/docker.sock:/var/run/docker.sock -v /usr/local/docker/jenkins/var/bin/docker:/usr/bin/docker -v /usr/local/docker/jdk:/var/jenkins_home/jdk -v /usr/local/docker/maven:/var/jenkins_home/maven jenkins/jenkins:latest
# 登陆jenkins http://ip:8888
cat /var/jenkins_home/secrets/initialAdminPassword 查看初始密码