admin管理员组

文章数量:1639831

Docker

  • ①基础部分
    • 一、是什么?
    • 二、安装
      • *(1)阿里云服务器*
        • 1、卸载旧的版本
        • 2、安装需要的安装包
        • 3、设置镜像仓库
        • 4、安装docker相关
          • (1)建议先更新yum软件包索引
          • (2)安装docker
        • 5、启动docker
        • 6、查看docker是否启动成功
        • 7、测试hello-world
        • 8、查看已下载的镜像
        • 9、补充
          • 1、阿里云镜像加速
      • *(2)centos6.8安装Docker*
      • (3)docker离线安装
      • (4)docker打成离线tar包
    • 三.卸载
      • 1、卸载依赖
      • 2、删除资源
    • 四、docker常用命令
      • 1、帮助命令
      • 2、镜像命令
      • 3、容器命令
      • 4、常用其他命令
      • 5、命令小结
  • ②练习部分
    • 一、Docker安装nginx
    • 二、Docker安装tomcat
    • 三、思考
    • 四、docker安装mysql
    • 五、docker安装postgres
    • 六、docker安装mongo
    • 七、docker安装redis
  • ③docker可视化工具(平时不用)
    • 一、portainer
    • 二、rancher持续集成/部署使用
  • ④docker镜像的自定义
    • 一、提交镜像
    • 二、容器数据卷
    • 三、Dockerfile
      • 1、构建docker镜像的构建文件,命令参数脚本!
      • 2、制作自己的tomcat镜像
    • 四、docker网络相关知识
      • 1、docker0
      • 2、自定义网络
      • 3、更改docker ip
    • 五、Docker部署redis集群
    • 六、springboot微服务项目打包Docker镜像
  • 学习视频
  • ⑤docker进阶
    • 一、Docker Compose
    • 二、实战springboot项目上线

官方文档

①基础部分

一、是什么?


官网安装说明文档地址
官网命令文档地址
docker常用命令博客:40 张图详解 Docker 容器监控



二、安装

(1)阿里云服务器

1、卸载旧的版本
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

2、安装需要的安装包
yum install -y yum-utils

3、设置镜像仓库

国外镜像,很慢,不建议使用:

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

建议使用国内阿里云镜像:

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、安装docker相关
(1)建议先更新yum软件包索引
yum makecache fast

(2)安装docker

说明:1、命令中的docker-ce 代表社区版,docker-ee代表企业版,建议使用社区版
2、默认安装最新版本,如果需要指定版本可以使用yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

yum install docker-ce docker-ce-cli containerd.io

5、启动docker
systemctl start docker
6、查看docker是否启动成功
docker version

7、测试hello-world

docker run hello-world

8、查看已下载的镜像
docker images
9、补充
1、阿里云镜像加速



(2)centos6.8安装Docker


第二步改成:yum install https://get.docker/rpm/1.7.1/centos-6/RPMS/x86_64/docker-engine-1.7.1-1.el6.x86_64.rpm

(3)docker离线安装

  1. 下载docker安装包
    官方地址:https://download.docker/linux/static/stable/x86_64/docker-19.03.9.tgz
    我已经下载好的资源:docker安装包
  2. 解压缩:tar -zxvf docker-19.03.9.tgz
  3. 解压的docker文件夹全部移动至/usr/bin目录:cp -p docker/* /usr/bin
  4. 将docker注册为系统服务
    ① 在/usr/lib/systemd/system/目录下,创建docker.service文件
    ② 编辑docker.service文件: vi /usr/lib/systemd/system/docker.service,粘贴如下内容
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker
After=network.target docker.socket
[Service]
Type=notify
EnvironmentFile=-/run/flannel/docker
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/dockerd \
                -H tcp://0.0.0.0:4243 \
                -H unix:///var/run/docker.sock \
                --selinux-enabled=false \
                --log-opt max-size=1g --iptables=true
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
  1. 重启生效
    重启守护进程:systemctl daemon-reload、systemctl start docker
    查看docker状态:systemctl status docker

    设置开机启动:systemctl enable docker

    docker version,验证是否安装成功

(4)docker打成离线tar包

打包命令:sudo docker save -o elasticsearch:8.5.0.tar elasticsearch:8.5.0
打包多个:docker save -o docker.tar postgres:latest minio/minio:latest nginx:latest mysql:5.7 mongo:latest elastic/metricbeat:7.13.0 elasticsearch:7.13.0 tomcat:9.0.41-jdk8-corretto logstash:7.4.0
加载命令:docker load --input postgres.tar

三.卸载

1、卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

2、删除资源

rm -rf /var/lib/docker # /var/lib/docker  docker的默认工作路径

四、docker常用命令

1、帮助命令

docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help #万能帮助命令

2、镜像命令

docker images -a # 查看本机所有镜像
docker search mysql # 搜索mysql镜像
docker pull mysql:5.7 # 下载镜像
docker rmi -f 容器id #删除镜像




3、容器命令

docker pull centos
docker ps # 正在运行的容器
docker ps -a # 运行过的所有容器
docker rm -f $(docker ps -q)  #遍历删除所有容器

4、常用其他命令






docker logs -ft --tail 10 b38c72cb0c9f #查看镜像id为b38c72cb0c9f的十行日志
docker inspect b38c72cb0c9f #查看id为b38c72cb0c9f的镜像(容器)详细信息
docker exec -it b38c72cb0c9f /bin/bash # 进入容器后开启一个新的终端(进去后可操作容器)
docker attach b38c72cb0c9f # 进入容器中正在运行的终端(不会启动新的进程)

5、命令小结

②练习部分

一、Docker安装nginx

docker search nginx # 搜索nginx
docker pull nginx # 下载nginx
docker run -d --name nginx01 -p 3344:80 nginx # docker启动nginx,-d后台运行,--name名称,-p宿主机端口:容器内部端口
curl localhost:3344 # 访问本机3344
docker exec -it nginx01 /bin/bash # 进入nginx
whereis nginx # 查找nginx
# 挂载相关目录 注意参数--network host 将网络映射出来,在nginx.conf配置文件里面, nginx静态资源配置在容器内部/usr/share/nginx/html,而不是服务器的/usr/local/project/nginx/html,比如下图
docker run --name nginx -e TZ="Asia/Shanghai" -d -p 8021:8021 --network host -v /usr/local/project/nginx/html:/usr/share/nginx/html -v /usr/local/project/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /usr/local/project/nginx/conf:/etc/nginx/conf.d -v /usr/local/project/nginx/logs:/var/log/nginx nginx:1.12.1

二、Docker安装tomcat

docker run -it --rm tomcat:9.0 # 启动tomcat,用完即删,ps查不到,建议只当测试用
docker pull tomcat:9.0 # 先下载,再启动,建议使用
docker run -d -p 3344:8080 --name tomcat01 tomcat # 启动tomcat
docker exec -it tomcat01 /bin/bash # 进入容器,访问3344 

三、思考

每次修改nginx配置都得进入到容器内,很麻烦,能不能在宿主机上修改然后映射到容器内? -v 数据卷

四、docker安装mysql

完整的docker+springboot+mysql部署

docker run -itd --name mysql -v /usr/local/project/mysql/data:/var/lib/mysql -v /usr/local/project/mysql/conf:/etc/mysql/conf.d -v /usr/local/project/mysql/logs:/var/log/mysql  -p 3357:3306 -e MYSQL_ROOT_PASSWORD=123321Frq mysql:5.7

五、docker安装postgres

docker run --name postgres -v /usr/local/project/postgresql/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=123321Frq -d -p 5432:5432 kartoza/postgis:12.1

修改pg最大连接数?

1、如果运行pg的时候没有挂载配置文件,可以进到容器内部进行修改配置
2、如果容器内部没有vim命令,需要用docker exec -it --user root 1837cf8cd4b9 /bin/bash以管理员身份进入,依次执行apt-get updateapt-get install vim等待安装成功即可
3、如果是内网环境,就只能挂载文件了

六、docker安装mongo

新建如下文件夹:

conf文件夹下新建mongo.conf,内容如下:

dbpath = /usr/local/project/mongo/data  #数据文件存放目录
logpath = /usr/local/project/mongo/log/ #日志文件存放目录
port = 27017  #端口号
fork = true  #以守护程序的方式启用,即在后台运行
maxConns=500 #最大同时连接数
journal=true #每次写入会记录一条操作日志
logappend=true #使用追加方式写日志
auth=true  #是否需要登录认证,配置账号密码需要开启,这里注释掉
noauth=true #不启用验证
storageEngine=wiredTiger  #存储引擎有mmapv1、wiretiger、mongorocks
bind_ip=0.0.0.0 #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB

启动命令:

docker run -d \
--name mongo  \
-p 27017:27017 \
-v /usr/local/project/mongo/data:/data/db \
-v /usr/local/project/mongo/conf:/data/conf \
-v /usr/local/project/mongo/log:/data/log \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=123321Frq \
--privileged=true \
--restart always \
mongo:4.2

七、docker安装redis

先去下载个对应版本的配置文件redis官网,拷贝到你的文件夹

#redis –restart=always 总是开机启动 –log是日志方面的 -p 6379:6379 将6379端口挂载出去 –name 给这个容器取一个名字 	 -v 数据卷挂载 -d redis 表示后台启动redis –appendonly yes 开启redis 持久化 –requirepass 000415 设置密码
docker run --restart=always --log-opt max-size=256m --log-opt max-file=2 -p 6379:6379 --name redis -v /usr/local/project/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/project/redis/data:/data -d redis:5.0.14 redis-server /etc/redis/redis.conf  --appendonly yes  --requirepass 123321Frq

③docker可视化工具(平时不用)

一、portainer

docker run -dit -p 3344:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

二、rancher持续集成/部署使用

④docker镜像的自定义

一、提交镜像

所有应用都可以打包成docker镜像,直接部署

docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG] # 提交容器成为一个新的副本,与git原理类似

二、容器数据卷

容器之间数据共享,数据存放在宿主机。

#   挂载宿主机某目录比如/docker/dms/service_engine_lucene/data,到容器某目录比如/usr/share/elasticsearch/data,
#按以下步骤依次进行,每步必须执行
(1)将宿主机的文件夹赋予权限
chmod -R 777 /docker/dms/service_engine_lucene/data
(2)将容器内的目录赋予特权
(2-1)保证容器启动的前提下,进入容器内部
docker exec -it e96cd2bab23d /bin/bash或者以管理员身份进入( docker exec -it -u root 3718f73b385e bash)
(2-2)添加selinux规则,将要挂载的目录添加到白名单
chcon -Rt svirt_sandbox_file_t /usr/share/elasticsearch/data
(2-3)退出容器
exit;
(3)执行挂载命令docker run -it -v /home/ceshi:/home centos /bin/bash # docker run -it -v 主机目录:容器内目录 镜像名称
docker run -it -v /docker/dms/service_engine_lucene/data:/usr/share/elasticsearch/data elasticsearch:7.13.0
(4)如果挂载过程仍出现文件找不到异常(Exception in thread "main" java.nio.file.NoSuchFileException: 
/usr/share/elasticsearch/config/jvm.options),手动拷贝后再执行挂载命令
docker cp elasticsearch:/usr/share/elasticsearch/config /docker/dms/service_engine_lucene/
(5)启动es
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -d elasticsearch:7.13.0


具名和匿名挂载


三、Dockerfile

1、构建docker镜像的构建文件,命令参数脚本!


dockerfile的指令(一定要大写!):

FROM  #from 基础镜像,一切从这里构建
MAINTAINER  #maintainer 镜像是谁写的,姓名+邮箱
RUN  #run 镜像构建的时候需要运行的命令
WORKDIR  #work dir镜像的工作目录
VOLUME  #volume挂载的目录
EXPOSE  #expose暴露的端口配置
CMD  #cmd指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #entry point指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD  #on build当构建一个被继承的 ,dockerfile就会运行ONBUILD的指令。触发指令
COPY  #copy类似ADD,将文件拷贝到镜像中
ENV  #env设置环境变量 

构建步骤:
1、编写一个dockerfile
2、docker build构建成一个镜像
3、docker run 运行镜像
4、docker push 发布镜像(dockerHub、阿里云镜像仓库)

根据上面四步,实现小demo(安装centos并安装vim及网络相关命令)
第一步:编写一个dockerfile

vim myDockerFile001 #内容如下: 

FROM centos
MAINTAINER EricFRQ<www.1726894668@foxmail.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "---end---"
CMD /bin/bash
ONBUILD RUN echo "i am build now"

i #进入编辑模式
esc+:wq #保存并退出

第二步:docker build构建成一个镜像

docker build -f myDockerFile001 -t mycentos:0.1 . #编译dockerfile,注意后面有个点


第三步:测试运行

docker run -it mycentos:0.1 #运行制作的mycentos


cmd和entrypoint的区别

第四步:发布镜像
(1)发布到dockerHub

  1. 进入官网注册账号:https://hub.docker/
  2. docker登录
  3. push到dockerHub


    (2)发布到阿里云镜像

2、制作自己的tomcat镜像

四、docker网络相关知识

1、docker0

两个容器之间是可以ping通的



2、自定义网络




3、更改docker ip

docker的默认ip是172.17.0.1,当其网段与局域网段冲突时就需要手动更改.方法如下:
输入以下命令:

systemctl stop docker
sudo vim /etc/docker/daemon.json

在daemon.json中输入:

{
"registry-mirrors": ["https://00s5k4m1.mirror.aliyuncs"],"bip": "192.168.12.1/16"
}

保存后运行:

systemctl start docker

五、Docker部署redis集群

# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6);\
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 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 通过脚本运行六个redis
for port in $(seq 1 6);\
docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
docker exec -it redis-1 /bin/sh #redis默认没有bash
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379  --cluster-replicas 1
  1. 创建redis网络并通过脚本创建6个redis配置文件

  2. 启动六个redis

  3. 进入redis-1

    使用集群方式创建集群(三从三主)此步输入yes

  4. 连接进入redis集群

  5. 查看主从信息

  6. 测试添加值

六、springboot微服务项目打包Docker镜像

1、新建Dockerfile(注意名称大小写),内容如下

#设置运行所需的java环境
FROM openjdk:8-jre
#设置指向了容器内的/tmp的目录,由于 Spring Boot 使用内置的Tomcat容器,
#Tomcat 默认使用/tmp作为工作目录。这个命令的效果是:在宿主机的/var/lib/docker目录下
#创建一个临时文件并把它链接到容器中的/tmp目录。
#注意:VOLUME 命令只能指定挂载点,也就是说在此处,只能指定容器内的目录,不能指定宿主机上对应的目录,
#也就是说是宿主机上自动生成的目录 去挂载了  容器内的指定的/tmp目录!!!
#如果想要指定宿主机的目录去进行挂载,只能通过run命令中的 -v参数进行 宿主机的指定目录挂载容器内的指定目录
VOLUME /tmp
#设置作者名称
MAINTAINER EricFRQ
#将此路径下所有的jar包都添加到镜像中,并重命名为system.jar
ADD *.jar system.jar
#添加启动镜像时的命令,这里仅设置了启动默认端口
CMD ["--server.port=10012"]
#设置对外暴露的端口
EXPOSE 10012
#ENTRYPOINT 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。
#-Djava.security.egd=file:/dev/./urandom
#添加java.security.egd的系统属性指向/dev/urandom,JVM上的随机数与熵池策略
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-Dport=10012","-jar","/system.jar"]

2、上传自己的jar和DockerFile到服务器某同一目录下
3、进入上传的目录,编译DockerFile,命令如下

docker build -t system . #后面一定要有个 .


4、查看是否编译成功并运行测试

docker images


5、后台运行

docker run --name system -itd --net=host  system

需要注意spring boot项目的时区问题:时区问题解决方案
6、上传镜像

学习视频

【狂神说Java】Docker最新超详细版教程通俗易懂

⑤docker进阶

下半场

一、Docker Compose

简介:定义运行多个容器
关于compose的官方文档说明

二、实战springboot项目上线

  1. 编写springboot项目,其中使用到了redis
  2. 修改application.properties关于redis的配置
server.port=8080
server.redis.host=redis # 这里在服务器上就是使用域名访问
  1. 将项目打包成jar,在同一个文件夹下操作以下步骤
  2. 编写Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
  1. 编写docker-compose.yml编排项目
version: '3.8'
services:
	myapp:
		build: . # 指定为当前目录下的Dockerfile,也可以在下面指定自己的Dockerfile文件,dockerfile:MyDockerfile
		image: myapp # 自己起名即可
		depends_on:
			- redis # 依赖于redis
		ports:
			- "8080:8080" 
	redis:  # redis服务
		image: "redis:alpine"
	# mysql:...    如果还依赖于mysql,在下面其他依赖的服务即可
  1. 将上面的jar、Dockerfile、docker-compose.yml上传至安装了docker和docker-compose的服务器,使用命令docker-compose up启动或docker-compose up --build先构建再启动 自己的compose

本文标签: Docker