翼度科技»论坛 云主机 LINUX 查看内容

docker学习

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
Docker概述

真实项目部署环境可能非常复杂,传统发布项目一个只需要一个jar包,运行环境需要单独部署。而通过Docker可将jar包和相关环境(如jdk,redis,Hadoop...)等打包到docker镜像里,将镜像发布到Docker仓库,部署时下载发布的镜像,直接运行发布的镜像即可。Docker容器使用沙箱机制,通过隔离机制,使每个发布的应用之间互相隔离,相互之间不会有任何接口。
优点:隔离,镜像轻巧,秒级启动。
文档地址:https://docs.docker.com/
仓库地址:https://hub.docker.com/

  • Docker基本组成:

    1.镜像(image):类似于一个模板,通过这个模板来创建容器服务,如tomcat镜像=》run命令运行镜像=》创建tomcat容器
    2.容器(container):Docker利用容器技术,可独立运行一个或一组应用,是通过镜像来创建的。可以执行启动,停止,删除等命令。暂时可将容器理解为一个简易的linux系统。
    3.仓库(repository):存放镜像的地方,分为共有仓库(如Docker hub)和私有仓库。
Docker安装

根据帮助文档:
  1. #1.卸载旧版本
  2. sudo yum remove docker \
  3.                   docker-client \
  4.                   docker-client-latest \
  5.                   docker-common \
  6.                   docker-latest \
  7.                   docker-latest-logrotate \
  8.                   docker-logrotate \
  9.                   docker-engine
  10. #2.安装包
  11. sudo yum install -y yum-utils
  12. #3.设置镜像仓库
  13. sudo yum-config-manager \
  14.     --add-repo \
  15.     https://download.docker.com/linux/centos/docker-ce.repo #默认国外的,非常慢
  16. sudo yum-config-manager \
  17.     --add-repo \
  18.     https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #推荐阿里云
  19. #4.更新软件包索引
  20. yum makecache fast
  21. #4.安装Docker引擎 (docker-ce:社区版)
  22. sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  23. #5.启动Docker
  24. sudo systemctl start docker
  25. #docker version查看是否安装成功
复制代码
  1. #6.测试helloword
  2. sudo docker run hello-world
复制代码
  1. #7.查看下载的hello-world镜像
  2. docker images
复制代码
  1. #8.卸载docker
  2. #移除Docker引擎
  3. sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
  4. #移除镜像
  5. sudo rm -rf /var/lib/docker
  6. sudo rm -rf /var/lib/containerd
复制代码
阿里云镜像加速

  • 进入阿里云官网的容器镜像服务,找到镜像加速地址

  • 配置使用
  1. sudo mkdir -p /etc/docker
  2. sudo tee /etc/docker/daemon.json <<-'EOF'
  3. {
  4.   "registry-mirrors": ["https://1kc9p0un.mirror.aliyuncs.com"]
  5. }
  6. EOF
  7. sudo systemctl daemon-reload
  8. sudo systemctl restart docker
复制代码

数据卷容器

多个容器之间共享数据(通过 --volume-from)
  1. [root@cchuang cchuang]# docker pull mysql
  2. Using default tag: latest  #如果不写tag,默认最新版
  3. latest: Pulling from library/mysql
  4. 72a69066d2fe: Pull complete    #分层下载
  5. 93619dbc5b36: Pull complete
  6. 99da31dd6142: Pull complete
  7. 626033c43d70: Pull complete
  8. 37d5d7efb64e: Pull complete
  9. ac563158d721: Pull complete
  10. d2ba16033dad: Pull complete
  11. 688ba7d5c01a: Pull complete
  12. 00e060b6d11d: Pull complete
  13. 1c04857f594f: Pull complete
  14. 4d7cfa90e6ea: Pull complete
  15. e0431212d27d: Pull complete
  16. Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
  17. Status: Downloaded newer image for mysql:latest
  18. docker.io/library/mysql:latest  #真实地址
  19. #指定版本下载
  20. [root@cchuang cchuang]# docker pull mysql:5.7
  21. 5.7: Pulling from library/mysql
  22. 72a69066d2fe: Already exists
  23. 93619dbc5b36: Already exists
  24. 99da31dd6142: Already exists
  25. 626033c43d70: Already exists
  26. 37d5d7efb64e: Already exists
  27. ac563158d721: Already exists
  28. d2ba16033dad: Already exists
  29. 0ceb82207cd7: Pull complete
  30. 37f2405cae96: Pull complete
  31. e2482e017e53: Pull complete
  32. 70deed891d42: Pull complete
  33. Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
  34. Status: Downloaded newer image for mysql:5.7
  35. docker.io/library/mysql:5.7
复制代码
  1. docker pull centos
复制代码
  1. docker run [参数] image
  2. #参数说明:
  3. --name="Name" #容器名称,tomcat1,Tomcat2
  4. -d            #后台运行
  5. -it            #交互方式运行,进入容器查看内容
  6. -p            #指定容器端口
  7.      -p  ip:主机端口:容器端口(常用)
  8.     -p  主机端口:容器端口(常用)
  9.     -p  容器端口
  10. -P            #随机指定端口
  11. #测试
  12. [root@cchuang ~]# docker run -it centos /bin/bash  #启动并进入容器
  13. [root@a25b788abecd /]#
  14. #查看容器内的centos
  15. [root@a25b788abecd /]# ls
  16. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
  17. #退出容器(exit:退出容器并停止;ctrl+P+Q:容器退出不停止)
  18. [root@a25b788abecd /]# exit
  19. exit
  20. #列出所有运行容器
  21. [root@cchuang /]# docker ps
  22. CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
  23. [root@cchuang /]# docker ps -a
  24. CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                          PORTS     NAMES
  25. a25b788abecd   centos         "/bin/bash"   3 minutes ago   Exited (0) About a minute ago             agitated_khorana
  26. 8e4b0bac5001   feb5d9fea6a5   "/hello"      3 hours ago     Exited (0) 3 hours ago                    epic_hypatia
  27. #删除容器
  28. docker rm 容器id      #删除指定容器,不能删除正在运行的容器,若强制删除,-f
  29. docker rm -f $(docker ps -aq)  #删除所有容器
  30. docker ps -a -q|xargs docker rm #删除所有容器
  31. #启动和停止容器
  32. docker start 容器id    #启动容器
  33. docker restart 容器id  #重启容器
  34. docker stop 容器id      #停止容器
  35. docker kill 容器id      #
复制代码
  1. #docker run -d 镜像名
  2. [root@cchuang /]# docker run -d centos
  3. #docker ps 发现centos停止了
  4. #docker容器使用后台运行时,必须要有个前台进程,docker发现没有应用,就会自动停止。
  5. #nginx,容器启动后,发现没有提供服务,就会自动停止。
复制代码

可以用来实现多个mysql之间的数据共享
DockerFile介绍

DockerFile就是用来构建Docker镜像的,是一个命令脚本。
构建步骤:

  • 编写一个Dockefile文件
  • docker build构建成为一个镜像
  • docker run运行镜像
  • docker push发布镜像(docker hub或者阿里云镜像仓库)
官网centos镜像:

很多官方镜像都是基础包,很多功能都没有,我们通常会制作自己的镜像。
DockerFile构建过程


  • 注意:
    1.每个保留关键字都是大写字母。
    2.每个指令都会创建提交一个新的镜像层,并提交。


  • dockerfile指令说明:
  1. docker logs
  2. #显示指定条数的日志
  3. -ft    #显示格式时间戳
  4. --tail 10  #显示条数
  5. [root@cchuang /]# docker logs -ft --tail 10 ddeeded713ed
复制代码

  • 构建自己的centos镜像(原始centos镜像没有vim和ipconfig命令)
  1. #docker top 容器id
  2. [root@cchuang /]# docker top ddeeded713ed
  3. UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
  4. root                17484               17465               0                   11:15               pts/0               00:00:00            /bin/bash
复制代码
  1. [root@cchuang /]# docker inspect ddeeded713ed
复制代码
  1. docker exec -it 容器id /bin/bash
  2. docker attach 容器id
复制代码
  1. #docker cp 容器id:容器内路劲  目标主机路劲
  2. [root@cchuang /]# docker ps
  3. CONTAINER ID   IMAGE     COMMAND       CREATED       STATUS       PORTS     NAMES
  4. ddeeded713ed   centos    "/bin/bash"   6 hours ago   Up 6 hours             cool_wozniak
  5. #查看主机路径
  6. [root@cchuang /]# cd /home
  7. [root@cchuang home]# mkdir test
  8. [root@cchuang home]# ls
  9. cchuang  test
  10. #进入容器内部
  11. [root@cchuang home]# docker attach ddeeded713ed
  12. [root@ddeeded713ed /]# cd home
  13. [root@ddeeded713ed home]# ls
  14. [root@ddeeded713ed home]# touch test.txt
  15. [root@ddeeded713ed home]# ls
  16. test.txt
  17. [root@ddeeded713ed home]# exit
  18. exit
  19. #拷贝文件到主机上
  20. [root@cchuang home]# docker cp ddeeded713ed:/home/test.txt /home/test
  21. Successfully copied 1.536kB to /home/test
  22. [root@cchuang home]# ls
  23. cchuang  test
  24. [root@cchuang home]# cd test
  25. [root@cchuang test]# ls
  26. test.txt
复制代码

  • CMD和ENTRYPOINT的区别
    ENTRYPOINT 中的参数始终会被使用,而CMD中的额外参数可以在容器启动时动态替换掉。
    如果Dockerfile文件既有CMD,又有ENTRYPOINT ,那么CMD将会被当做参数传递给ENTRYPOINT
Dockerfile制作Tomcat镜像

1.准备镜像文件,tomcat压缩包,jdk压缩包
  1. #1.搜索镜像
  2. [root@cchuang test]# docker search nginx
  3. #2.pull镜像
  4. [root@cchuang test]# docker pull nginx
  5. #3.启动容器并开放端口
  6. [root@cchuang test]# docker run -d --name nginx01 -p 3344:80 nginx
复制代码
2.编写dockerfile文件
  1. 开放端口:firewall-cmd --zone=public --add-port=3344/tcp --permanent
复制代码
  1. firewall-cmd --list-ports
复制代码
发布自己的镜像

发布dockerhub
  1. systemctl restart firewalld.service
复制代码
发布到阿里云
1.找到阿里云容器镜像服务
2.创建命名空间

3.创建镜像仓库

4.操作参考官方文档

小结图


Docker网络原理

理解Docker0
  1. 命令:iptables -A INPUT -p tcp --dport 3344 -j ACCEPT
复制代码


  • docker 是如何处理网络访问的?
    1.我们每启动一个容器,docker就会为docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0,桥接模式,使用veth-pair技术。

再启动一个容器,又多了一对网卡:
  1. docker run -d --name nginx0 -p 3344:80 nginx
复制代码

所有的容器不指定网络的情况下,都是通过Docker0路由的,docker会为容器分配一个可用ip,docker中的所有网络接口都是虚拟的。

容器互联 --link ;。
容器之间可以通过容器名ping通,如:
  1. systemctl restart docker
复制代码
  1. #1.es暴露的端口很多
  2. #2.耗内存
  3. #3.es数据一般要放到安全目录,挂载
  4. $ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
  5. #启动之后linux卡住,耗内存
  6. #查看cpu状态
  7. docker stats
  8. #关闭docker,增加es的内存限制,通过 -e 环境变量配置修改
  9. $ docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2
  10. docker stats
  11. CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT   MEM %     NET I/O     BLOCK I/O       PIDS
  12. de3ab3cae3fb   elasticsearch01   97.21%    318MiB / 1.715GiB   18.11%    656B / 0B   108MB / 246kB   26
复制代码
发现tomcat03的host配置文件和tomcat02的联系
  1. docker run -d -p 8088:9000 \
  2. --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
复制代码
自定义网络互联
  1. docker commit 提交容器成为一个新副本
  2. #命令和git原理近似
  3. docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
  4. #原tomcat镜像没有webapp下的应用,添加应用后提交镜像
  5. [root@cchuang ~]# docker commit -a="cchuang" -m="添加应用" 1274e9395923 tomcat1.0
  6. [root@cchuang ~]# docker images
  7. REPOSITORY            TAG       IMAGE ID       CREATED          SIZE
  8. tomcat1.0             latest    ad4efd5a4e82   24 seconds ago   684MB
复制代码
  1. 1.使用命令来挂载 -v
  2. docker run -it -v 主机目录:容器内目录
  3. docker run -it -v /home/test:/home tomcat /bin/bash
  4. #启动后通过docker inspect查看挂载信息
复制代码
  1. #1.拉取mysql镜像
  2. [root@cchuang /]# docker pull mysql:5.7
  3. -d  后台运行
  4. -p  端口映射
  5. -v  挂载
  6. -e  环境配置
  7. --name  容器名称
  8. #2.运行容器,需要做数据挂载,安装启动mysql时,需要设置密码
  9. [root@cchuang /]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
  10. #3.启动成功,从本地通过sqlyog连接服务器的3306,映射到容器内的3306
  11. #4.查看本地挂载目录
  12. [root@cchuang home]# ls
  13. cchuang  mysql  test
  14. [root@cchuang home]# cd mysql
  15. [root@cchuang mysql]# ls
  16. conf  data
  17. [root@cchuang mysql]# cd data
  18. [root@cchuang data]# ls
  19. auto.cnf         ib_buffer_pool  mysql               server-key.pem
  20. ca-key.pem       ibdata1         performance_schema  sys
  21. ca.pem           ib_logfile0     private_key.pem
  22. client-cert.pem  ib_logfile1     public_key.pem
  23. client-key.pem   ibtmp1          server-cert.pem
  24. #5.通过本地sqlyog创建一个test数据库,即docker容器内也会创建一个文件,查看本地挂载的data目录,发现多一个文件,挂载成功。
  25. [root@cchuang data]# ls
  26. auto.cnf         ib_buffer_pool  mysql               server-key.pem
  27. ca-key.pem       ibdata1         performance_schema  sys
  28. ca.pem           ib_logfile0     private_key.pem     test
  29. client-cert.pem  ib_logfile1     public_key.pem
  30. client-key.pem   ibtmp1          server-cert.pem
  31. #6.删除docker容器,linux本地挂载的data目录下的文件依旧存在,数据持久化。
  32. [root@cchuang data]# docker rm -f 60afb0e127e9
  33. [root@cchuang data]# ls
  34. auto.cnf         ib_buffer_pool  mysql               server-key.pem
  35. ca-key.pem       ibdata1         performance_schema  sys
  36. ca.pem           ib_logfile0     private_key.pem     test
  37. client-cert.pem  ib_logfile1     public_key.pem
  38. client-key.pem   ibtmp1          server-cert.pem
复制代码
网络连通,即如何让docker0和自定义网络之间实现通讯(本质是容器和网卡实现通讯)

  1. #匿名挂载(没有指定容器外的路径)
  2. [root@cchuang /]# docker run -d -p 80:80 --name nginx01 -v /etc/nginx nginx
  3. #查看所有volume情况
  4. [root@cchuang /]# docker volume ls
  5. DRIVER    VOLUME NAME
  6. local     1ef0259786a48805e8816ea03f5dafc92477a449d64117c4c3a4cda027906ba3
  7. local     52eeb7ad21d8cff59fdeab57ed8e3c9ca868620a542b9c058a6db8ba8504f1f3
复制代码
  1. #具名挂载(通过 -v 卷名:容器内路径)
  2. [root@cchuang /]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
  3. a4e76f8aecbd7889f85f7955eb1839924c4bf273fc807ef6cc0b2dab308c5f83
  4. [root@cchuang /]# docker volume ls
  5. DRIVER    VOLUME NAME
  6. local     juming-nginx
复制代码

部署Redis集群,建立自己的redis网卡。

  1. #查看一下挂载的卷
  2. [root@cchuang ~]# docker volume inspect juming-nginx
  3. [
  4.     {
  5.         "CreatedAt": "2023-04-17T17:33:31+08:00",
  6.         "Driver": "local",
  7.         "Labels": null,
  8.         "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
  9.         "Name": "juming-nginx",
  10.         "Options": null,
  11.         "Scope": "local"
  12.     }
  13. ]
复制代码
  1. #挂载方式
  2. -v 容器内路径      #匿名挂载
  3. -v 卷名:容器外路径    #具名挂载
  4. -v /宿主机路径:容器内路径  #指定路径挂载
复制代码
IDEA整合Docker


  • 将springboot应用打成jar包,编写Dockefile文件


  • 将Dockerfile和jar包上传到服务器
  1. #通过 -v 容器内路径:ro rw改变读写权限(对于容器来说,在容器内操作挂载出来的目录的权限)
  2. ro  readonly #只读 (只能从容器外部宿主机来操作,容器内部无法操作)
  3. rw  readwrite  #可读写
  4. [root@cchuang ~]# docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx
复制代码

  • 通过Dockerfile生成镜像
  1. #构建dockerfile文件
  2. [root@cchuang docker-file-volume]# vim dockerfile1
  3. [root@cchuang docker-file-volume]# cat dockerfile1
  4. FROM centos
  5. VOLUME ["volume01","volume02"]
  6. CMD echo "----end---"
  7. CMD /bin/bash
  8. #构建镜像
  9. [root@cchuang docker-file-volume]# docker build -f dockerfile1 -t cchuang/centos .
  10. [+] Building 0.1s (5/5) FINISHED                                                                                                                                         
  11. => [internal] load build definition from dockerfile1                                                                                                               0.0s
  12. => => transferring dockerfile: 121B                                                                                                                                0.0s
  13. => [internal] load .dockerignore                                                                                                                                   0.0s
  14. => => transferring context: 2B                                                                                                                                     0.0s
  15. => [internal] load metadata for docker.io/library/centos:latest                                                                                                    0.0s
  16. => [1/1] FROM docker.io/library/centos                                                                                                                             0.0s
  17. => exporting to image                                                                                                                                              0.0s
  18. => => exporting layers                                                                                                                                             0.0s
  19. => => writing image sha256:da9e95cba3f789425b8d7437106995c796f02b5bb5c0b05aa2c43df4399ef0f0                                                                        0.0s
  20. => => naming to docker.io/cchuang/centos                                                                                                                           0.0s
  21. #启动容器运行新建的镜像
  22. [root@cchuang docker-file-volume]# docker run -it cchuang/centos /bin/bash
  23. [root@f5826eedf0d5 /]# ls
  24. bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume01  volume02
  25. #查看挂载的路径
  26. [root@cchuang docker-file-volume]# docker inspect da9e95cba3f7
复制代码

  • 启动容器
  1. #启动三个容器,通过上面构建的镜像启动
  2. [root@cchuang ~]# docker run -it --name docker01 da9e95cba3f7
  3. [root@6e21966e1eaf /]# ls -l
复制代码

  • 访问测试,成功
  1. #创建docker02,通过--volume-from 继承docker01容器
  2. [root@cchuang ~]# docker run -it --name docker02 --volumes-from docker01 da9e95cba3f7
复制代码
Docker Compose容器编排

Docker Swarm集群部署

Jenkins(CI/CD)


来源:https://www.cnblogs.com/huang580256/p/17320737.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

上一篇: docker学习

下一篇: docker学习

举报 回复 使用道具