栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Docker

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Docker

文章目录
  • Docker
    • 一、Docker安装
      • 1、Docker的基本组成
      • 2、Docker常用命令
      • 3、可视化
      • 4、commit镜像
    • 二、容器数据卷
      • 1、使用数据卷
        • (1)方式一:直接使用命令挂载 -v
        • 实战训练:安装MySQL
        • 具名挂载和匿名挂载
      • 2、初始Dockerfile
        • (2)方式二:使用DockerFile(常用)
      • 3、数据卷容器
    • 三、DockerFile
      • 1、DockerFile介绍
      • 2、DockerFile构建过程
        • 基础知识
      • 3、DockerFile的指令
      • 实战测试:创建一个自己的centos
      • 实战测试:Tomcat镜像
    • 四、Docker网络

Docker 一、Docker安装 1、Docker的基本组成
  • 镜像(image):docker镜像就像是一个模板,可以通过这个模板来创建容器服务,通过这个镜像可以创建多个容器,最终服务运行或者项目运行都在容器中
  • 容器(container):Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建,可以把容器理解为简易的linux系统
  • 仓库(repository):仓库是存放镜像的地方,分为私有仓库,公有仓库
2、Docker常用命令
  • 帮助命令

    docker version #查看版本信息
    docker info #查看系统信息,包括镜像和容器的数量
    docker 命令 ——help #帮助命令
    
  • 镜像命令

    docker images #查看所有本地主机上的镜像
    
    REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
    hello-world   latest    feb5d9fea6a5   5 weeks ago   13.3kB
    
    REPOSITORY #镜像的仓库源
    TAG #镜像的标签
    IMAGE ID #镜像的id
    CREATED #镜像的创建时间
    SIZE #镜像的大小
    
    #可选项
    -a, --all             #列出所有镜像
    -q, --quiet         #只显示id
    
    docker search #搜索镜像
    
    docker pull #下载镜像
    
    docker rmi #删除镜像
    
    #可选项
    docker rmi -f 容器id #删除指定的容器
    docker rmi -f 容器id 容器id 容器id 容器id #删除多个容器
    docker rmi -f $(docker images -aq) #删除全部容器
    
  • 容器命令

    说明:有了镜像才能有容器,linux,下载一个centos镜像测试学习

    #创建容器并启动
    docker run [可选参数] image
    
    #参数说明
    --name="Name"   #容器名字 tomcat01 tomcat02 ,用来区分容器
    -d              #后台方式运行
    -it             #使用交互方式运行,进入容器查看内容
    -P              #指定容器端口 -p 8080:8080
    
    	-P ip:主机端口:容器端口
    	-P 主机端口:容器端口 (常用)
    	-P 容器端口
    	容器端口
    -p              #随机指定端口
    
    #测试
    #启动并进入容器
    [root@iZ8vbis43wevef6250tlrhZ ~]# docker run -it centos /bin/bash
    #查看容器内的centos,基础版本,很多命令不完善
    [root@0ff4aea98961 /]# ls
    bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    #退出容器
    [root@0ff4aea98961 /]# exit
    exit
    
    #列出所有运行的容器
    docker ps	#列出当前正在运行的容器
    
    #可选项
    docker ps -a	#列出正在运行的容器+历史运行过的容器
    docker ps -n=?	#显示最近创建的容器
    docker ps -q	#只显示容器的编号
    
    #退出容器
    exit #直接退出容器并停止
    Ctrl + P + Q #容器不停止并退出
    
    #删除容器
    docker rm 容器id					#删除指定容器(不能删除正在运行的容器) 强制删除 rm -f
    docker rm -f $(docker ps -aq)	 #删除所有容器
    docker ps -a -q|xargs docker rm  #删除所有容器
    
    #启动和停止容器的操作
    docker start 容器id	#启动容器
    docker restart 容器id	#重启容器
    docker stop 容器id	#停止当前正在运行的容器
    docker kill 容器id	#强制停止当前容器
    
  • 常用的其他命令

    #命令 docker run -d 镜像名
    docker run -d centos
    
    #问题 docker ps 发现centos停止了
    
    #常见的坑:docker 容器使用后台运行,就必须要有一前台进程,docker发现没有应用,就会自动停止
    
    #查看日志
    
    #自己编写一个shell脚本
    [root@iZ8vbis43wevef6250tlrhZ ~]# docker run -d centos /bin/sh -c "while true;do echo genius;sleep 1;done"
    
    #[root@iZ8vbis43wevef6250tlrhZ ~]# docker ps
    ConTAINER ID   IMAGE    
    4bf285b338b5   centos  
    
    #显示日志
    -tf		#显示日志
    --tail	#要显示的日志条数
    [root@iZ8vbis43wevef6250tlrhZ ~]# docker logs -tf --tail 10 4bf285b338b5
    
    #查看容器中进程信息
    docker top 容器id
    
    #查看镜像的元数据
    docker inspect 容器id
    
    #进入当前正在运行的容器
    docker exec -it 容器id /bin/bash	#方式一	进入容器后开启一个新的终端,可以在里面操作(常用)
    docker attach 容器id				#方式二	进入正在运行的终端,不会启动新的终端
    
    #从容器内拷贝文件到主机上
    docker cp 容器id:容器内路径 目的的主机路径
    
    [root@iZ8vbis43wevef6250tlrhZ home]# docker run -it centos /bin/bash				#运行一个容器
    [root@3db61aeb88c1 /]# cd /home														
    [root@3db61aeb88c1 home]# touch test.java											#在docker中创建test.java文件
    [root@iZ8vbis43wevef6250tlrhZ home]# docker cp 3db61aeb88c1:/home/test.java /home	#docker拷贝文件到主机
    [root@iZ8vbis43wevef6250tlrhZ home]# ls												#拷贝成功
    librarty_management.jar  nohup.out  test.java  www
    
3、可视化

Docker图形化管理页面( portainer)

#下载
docker run -d -p 8088:9000 
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true  portainer/portainer

4、commit镜像

docker commit 提交容器成为一个新的副本

#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
二、容器数据卷
  • 什么是容器数据卷

    1. docker理念:将应用和环境打包成一个镜像

    2. 如果数据在容器中,那么我们容器删除,数据就回丢失

      需求:数据可持久化

    3. docker容器中产生的数据,同步到本地

    4. 目录的挂载,将容器内的目录,挂载到Linux上面

    5. 容器的持久化和同步操作,容器间可以数据共享

1、使用数据卷 (1)方式一:直接使用命令挂载 -v
docker run -it -v 主机目录地址:容器内目录
#挂载信息 -v 卷

"Mounts": [
	{
		"Type": "bind",				
		"Source": "/home/ceshi",	#主机内地址
		"Destination": "/home",		#docker容器内地址
		"Mode": "",
		"RW": true,
		"Propagation": "rprivate"
	}
],

数据同步(容器 <==> 主机)

实战训练:安装MySQL
  • 获取镜像

    docker pull mysql:5.7
    
  • 运行容器,需要做数据挂载

    docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql
    
  • 安装启动MySql,需要配置密码

    #官方测试
    docker run --name 数据库名称 -e MYSQL_ROOT_PASSWORD=密码 -d mysql:tag
    
    docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
    
    -d 		#后台运行
    -p 		#端口映射
    -v		#卷挂载
    -e 		#环境配置
    --name 	#容器名字
    
具名挂载和匿名挂载
  • 匿名挂载

    -v 容器内地址
    docker run -d -P --name naginx01 -v /ect/nginx nginx
    
    #查看所有的volume的情况
    [root@iZ8vbis43wevef6250tlrhZ home]# docker volume ls
    DRIVER    VOLUME NAME
    local     b45807a6b7f000c44f440150bf5b5fae28fca90f323ebe19cd0ebae0a56bd695	#匿名挂载
    
    在-v的时候只写了容器内路径,没有写容器外的路径
    
  • 具名挂载

    大多数情况下推荐使用就具名挂载

    #具名挂载
    docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx/ nginx
    #查看所有的volume的情况
    [root@iZ8vbis43wevef6250tlrhZ data]# docker volume ls
    DRIVER    VOLUME NAME
    local     b45807a6b7f000c44f440150bf5b5fae28fca90f323ebe19cd0ebae0a56bd695	#匿名挂载
    local     jumin-nginx														#具名挂载
    
    #通过 -v 卷名:容器内路径 查看卷
    [root@iZ8vbis43wevef6250tlrhZ data]# docker volume inspect jumin-nginx
    [
        {
            "CreatedAt": "2021-11-05T20:57:48+08:00",
            "Driver": "local",
            "Labels": null,
            "Mountpoint": "/var/lib/docker/volumes/jumin-nginx/_data",	#卷路径
            "Name": "jumin-nginx",
            "Options": null,
            "Scope": "local"
        }
    ]
    
    #所有的docker容器内的卷,没有指定目录的情况下都在 "/var/lib/docker/volumes/jumin-nginx/_data"
    
  • 区分具名挂载,匿名挂载,指定路径挂载

    -v 容器内路径				#匿名挂载
    -v 卷名:容器内路径			  #具名挂载
    -v /宿主机路径:容器内路径		#指定路径挂载
    
  • 拓展

    #通过-v 容器内路径:ro rw 改变读写权限
    ro	readonly 	#只读(只能通过宿主机来操作,容器内无法操作)
    rw	readwrite 	#可读可写
    
    #一旦设置了容器权限,容器对我们挂载出来的内容就有了限定
    docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx:ro nginx
    docker run -d -P --name nginx02 -v jumin-nginx:/etc/nginx:rw nginx
    
    
2、初始Dockerfile (2)方式二:使用DockerFile(常用)
  • Dockerfile就是用来构建docker镜像的文件,命令脚本
  • 通过脚本可以生成镜像,镜像就是一层一层的,脚本一个个的命令,每个命令就是一层
vim dockerfile1
#创建一个dockerfile文件 名字可以随意,建议使用Dockerfile
#文件中的内容 指令(大写) 参数

FROM centos

VOLUME ["volume01","volume02"]	#匿名挂载

CMD echo "----end----"
CMD /bin/bash

#这里每个命令 就是镜像的一层
docker build -f /home/docker-test-volume/dockerfile1 -t genius/centos1.0 .
#				文件路径									镜像名称

[root@iZ8vbis43wevef6250tlrhZ docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
genius/centos1.0      latest    e09cdff19b0c   9 minutes ago   231MB
#启动容器
[root@iZ8vbis43wevef6250tlrhZ docker-test-volume]# docker run -it e09cdff19b0c /bin/bash
[root@145ebb74b3cb /]# ls -l
........
drwxr-xr-x   2 root root 4096 Nov  6 02:18 volume01		#生成镜像自动挂载的数据卷目录
drwxr-xr-x   2 root root 4096 Nov  6 02:18 volume02
3、数据卷容器
  • 多个mysql同步数据
#创建并运行容器docker01
docker run -it --name docker01 e09cdff19b0c
#创建并运行容器docker01 挂载到docker01
#						son		extend			father(docker01 就是数据卷容器)
docker run -it --name docker02 --volumes-from docker01 e09cdff19b0c
  • 删除docker01容器,docker01文件依旧在
  • 共享卷是一种拷贝的概念
docker run -d -p 3355:3306 -v /home/mysql/conf:/etc/myslq/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

docker run -d -p 3355:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
  • 结论:

    容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。

    但是一旦持久化到了本地,本地的数据是不会删除的

三、DockerFile 1、DockerFile介绍
  • DockerFile是用来构建docker镜像的文件,命令参数脚本
  • 构建步骤
    1. 编写一个dockerfile文件
    2. docker build构建成为一个镜像
    3. docker run运行镜像
    4. docker push发布镜像
2、DockerFile构建过程 基础知识
  1. 每个保留关键字(指令)都必须是大写字母

  2. 执行从上到下顺序执行

  3. #表示注解

  4. 每一个指令都会创建一个新的镜像层,并提交

  5. 步骤:开发,部署,运围

    DockerFile:构建文件,定义了一切的步骤,源代码

    DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品

    Docker容器:容器就是镜像运行起来提供服务器

3、DockerFile的指令
FROM		# 基础镜像,一切从这里开始构建
MAINTAINER	# 镜像是谁写的,姓名+邮箱
RUN 		# 镜像构建的时候需要运行的命令
ADD 		# 步骤:tomcat镜像,添加内容
WORKDIR 	# 镜像的工作目录
VOLUME		# 挂载的目录
EXPOST		# 暴露端口位置
CMD			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	# 指定这个容器启动的时候要运行的命令
onBUILD		# 当构建一个被继承 DockerFile 的时候,运行。触发指令
COPY		# 类似ADD,将文件拷贝到镜像中
ENV			# 构建的时候设置环境变量
实战测试:创建一个自己的centos
  • 创建一个自己的centos

  • 编写配置文件

    #编写配置文件
    FROM centos
    MAINTAINER genius<2629425320@qq.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
    
  • 通过这个文件构建镜像

    docker bild -f dockerfile文件路径 -t 镜像名:[tag]
    
    Successfully built e2749f018b27
    Successfully tagged mycentos:0.1
    
  • 测试运行

    [root@iZ8vbis43wevef6250tlrhZ dockerfile]# docker run -it e2749f018b27
    [root@5d5995c57143 local]# pwd
    /usr/local
    
  • CMD 和 ENTRYPOINT的区别

    CMD			# 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
    ENTRYPOINT	# 指定这个容器启动的时候要运行的命令
    

    CMD后面不能追加命令,CMD 的追加命令会覆盖CMD的命令

    ENTRYPOINT的追加命令直接拼接再ENTRYPOINT命令后面

实战测试:Tomcat镜像
  1. 准备镜像文件tomcat压缩包,jdk压缩包

  2. 编写Dockerfile文件,官方命名,build会自动寻找这个文件,不需要-f指定了

    FROM centos
    MAINTAINER genius<2629425320@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u144-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.48-linux.tar.gz /usr/local
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0/bin/startup.sh && tail -F /url/local/apache-tomcat-9.0/bin/logs/catalina.out
    
  3. 构建镜像

    docker build -t mytomcat .
    
  4. 启动镜像

    docker run -d -p 3344:8080 --name geniustomcat -v /home/genius/build/tomcat/test:/usr/local/apache-tomcat-9.0/webapps/test -v /home/genius/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0/logs mytomcat mytomcat
    
  5. 发布项目

    挂载到了/home/genius/build/tomcat/test,直接将项目文件放入即可

    日志挂载到/home/genius/build/tomcat/tomcatlogs/,可直接查看

四、Docker网络
  • 理解Docker网络

    [root@iZ8vbis43wevef6250tlrhZ ~]# ip addr
    # 本机回环地址
    1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    #阿里云内网地址
    2: eth0:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 00:16:3e:08:fe:d8 brd ff:ff:ff:ff:ff:ff
        inet 172.18.142.46/20 brd 172.18.143.255 scope global dynamic eth0
           valid_lft 314952895sec preferred_lft 314952895sec
        inet6 fe80::216:3eff:fe08:fed8/64 scope link 
           valid_lft forever preferred_lft forever
    #docker0地址
    3: docker0:  mtu 1500 qdisc noqueue state DOWN group default 
        link/ether 02:42:7b:b0:12:93 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:7bff:feb0:1293/64 scope link 
           valid_lft forever preferred_lft forever
    

    三个网络代表了三种不同的环境

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/457747.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号