目录
第一章 Linux命令
Linux常用命令:Linux常用命令
第二章 Dcoker简介
2.1 容器化与虚拟化
2.2 Docker 简介
(1)可以让开发者打包应用和依赖包,放到一个轻量级可移植的容器中,然后发布到任何流行的Linux机器上,也可实现虚拟化。
(2)使用沙箱机制,相互之间不会有接口。
(3)分社区版和企业版,我们用社区版。
2.3 Docker架构
(1)使用C/S架构模式,用远程API来管理和创建容器。
(2)通过docker镜像来创建docker容器。
(3)容器和镜像的关系,类似编程语言中的对象和类。
(4)基本组件:
Docker镜像:用于创建Docker容器的模板,比如Ubuntu。
Docker容器:独立运行的一个或者一组应用,是镜像的实体。是一个虚拟服务器。
Docker客户端:客户端通过命令行或者其他工具使用Docker SDK。
Docker主机:一个物理或者虚拟的机器,用于执行Docker守护进程和容器。
Docker Registry:Docker仓库,是一个地址服务器,用来保存镜像,如 docker hub。
Docker Machine:一个简化Docker安装的命令行工具. 通过一个简单的命令行即可在相应平台上安装Docker。
2.4 为什么要使用Docker
最重要:一致的运行环境
Docker镜像提供了除内核外完整的一个运行时环境,确保了应用运行环境的一致性。
2.5 Docker基础概念
(1)Docker:就是一个服务
(2)仓库:存放镜像的地址服务器
(3)镜像:一个可执行的包,包括运行应用程序所需要的所有内容包
(4)容器:镜像真正被启动时生成的虚拟服务器
(5)数据卷:一个可供多个容器使用的特殊目录,可以在容器之间共享和重用。
对数据卷的修改马上生效。
对数据卷的更新,不会影响镜像。
默认一直存在,即使容器被删除。
(6)网络:容器的网络可以设置。
(7)Dockerfile:一个用来构建镜像的文本文件,包含了一条条构建镜像所需的指令和说明
第三章 安装Docker
3.1 CentOS下安装Docker
3.2 Windows Docker安装
第四章 Docker仓库
4.1 Docker hub
类似于GitLab
4.2 镜像加速
4.3 私有仓库
第五章 Docker镜像
5.1 什么是镜像
一个可执行的包,包括了运行应用程序所需要的所有内容包。
镜像内部是一个精简的操作系统,还包含应用运行所必须的文件和依赖包。
镜像不包括内核,容器共享所在Docker主机的内核。
5.2 镜像常见操作
(1)查找镜像: docker search 镜像名
(2)拉取镜像: docker pull 镜像名
(3)查看镜像: docker images
(4)镜像标签:拉取镜像时要带标签,比如mysql:8.0, 不指定标签时默认latest版本
我们可以给镜像打标签:docker tag 镜像ID <镜像名>:<tag>
一个镜像可以有多个标签,删除某个tag, 用docker rmi <镜像名>:<tag>.。
至少要保留一个,不然相当于删除了整个镜像。
(5)删除镜像
docker rmi image 镜像ID
docker image rmi 镜像ID
第六章 Docker容器
6.1 什么是容器
镜像的运行时实例。是镜像启动后一个虚拟服务器。一个镜像可以启动多个容器。
6.2 创建容器
(1)命令:docker run 镜像名
(2)示例
1)启动mysql容器:docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
2)进入mysql:mysql -u root -p
3)修改权限以支持远程登录:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
host为%表示不限制IP, localhost表示本机使用
plugin非mysql_native_password则需要修改密码
4)查看当前都有哪些容器:docker ps -a
5)启动tomcat容器:docker run -itd --name tomcat-test -p 8080:8080 -v $PWD/tomcat_file:/usr/local/tomcat/webapps/tomcat_file tomcat
在宿主机当前目录下创建一个tomcat_file文件夹,用于映射tomcat的webapps下的路径
6)docker start 容器名
6.3 查看容器
(1)docker ps -a:显示所有的容器
(2)docker ps -n:列出最新创建的n个容器
(3)docker ps -s:显示总的文件大小
6.4 进入容器
(1)命令:docker exec -it 容器ID /bin/bash
(2)参数解析:
-d: 分离模式,在后台运行
-i: 即使没有附加也保持STDIN打开
-t: 分配一个伪终端
/bin/bash 的作用:是因为docker后台必须运行一个进程,否则容器就会退出。这里表示启动容器后启动bash. 默认会以root用户权限进入到容器中,此时可以做任何操作。
(有部分命令没有在打镜像时没有包括,所以不能使用,需要手动安装)
6.5 停止容器
(1)docker stop 容器ID:会给一定的关闭时间交由容器自己保存状态
(2)docker kill 容器名:直接关闭容器
6.6 重启容器
(1)docker start 容器ID
6.7 删除容器
(1)docker rm 容器ID
6.8 修改容器
6.8.1 方式1:直接删除容器,用原来的镜像再次生成一个容器。
6.8.2 方式2:
(1)直接修改容器的配置文件:
容器的配置文件位于/var/lib/docker/containers下,文件名就是容器的ID。进文件夹,找到hostconfig.json并修改。其中:PortBindings是容器内的端口,HostIP是映射到宿主机的端口
(2)修改后重启docker服务,再启动容器。
缺点:如果docker服务下有多个容器,重启会影响其他容器
(3)利用docker commit 新构镜像.
把一个容器的文件改动和配置信息commit到一个新的镜像
docker stop 容器ID
docker commit 容器ID 新镜像名:tag
docker run -itd --name 新容器名 ..... 新镜像名:tag
6.9 查看容器日志
(1)命令:docker logs 容器ID
(2)参数解析:
-f: 跟踪日志输出
--since: 显示某个开始时间的所有日志
6.10 查看容器信息
(1)docker container inspect 容器ID
第七章 Docker网络
7.1 容器网络配置
(1)命令:docker network ls: 列出当前有的网络
7.2 几种常见网络模式
7.2.1 Host
(1)什么是host模式?
host模式,容器不会虚拟出自己的网卡和ip,会用宿主机的ip和端口。共享主机 172.17.0.1
但不影响外部访问。这种网络模式下,容器间的应用不能相互访问,因为容器自身没有生成ip
(2)如何设置容器的host网络?
启动容器时,通过--network=host来指定容器的网络模式:
docker run -itd --name tomcat_host -p 8080:8080 --network=host -v $PWD/tomcat_file:/usr/local/tomcat/webapps/tomcat_file tomcat
(3)注意:
此时如果有两个host容器,ip都是宿主IP,那怎么访问?答:通过端口区分
用host创建时用同一个8080:8080可以创建多个容器,无冲突。因为对外允许用相同的ip和端口。
($PWD取当前路径)
7.2.2 Bridge
(1)什么是Bridge模式?
创建容器时,如果不指定特殊的网络,则默认用bridge,自动生成以 172.17.0.1为网关的bridge网
(2)bridge网络如何工作?
1)docker进程启动时,在主机上创建一个名为docker0的虚拟网桥。此主机上所有容器通过交换机连在一个二层网络中。从docker0子网中分配一个ip给容器使用。docker0的ip地址为容器的默认网关。
2)主机上有两个核心网卡:eth0和docker0
eth0:主机ip
docker0:docker默认创建,ip为172.17.0.1
3)docker inspect 容器名:可查看容器所有信息,包括Network信息
4)这样在外部就可以通过宿主机的ip来访问容器里的内容 (加上端口来区分不同的容器?)
5)进容器里,通过curl命令访问其他容器
比如在mysql容器里,查看tomcat容器内容:curl http://172.17.0.3:8080/tomcat_file/11.txt
6)安装curl命令:apt-get update, apt-get install -y curl telnet
7.2.3 None
该模式下,容器关闭了网络功能,不能被其他网络访问。
通常用于一些批数据处理,纯计算的,测试性的应用。
7.2.4 Container
把已存在的一个容器当作网桥。
启动容器时,通过--net container:xxx 命令来建立连接。
表示使用xxx容器的ip作为自己的ip。
7.2.5 自定义网络(工作中用的最多)
下面自建bridge实现容器互通。
注意:上面几种情况,解决了外部环境如何访问容器内的应用。
7.3 容器间的互访
7.3.1 虚拟ip访问
(1)借用了容器的Bridge模式,通过docker0虚拟网桥来访问。
(2)缺点:当删除或重启容器时,容器ip会发生变化,得每次都需要修改连接的容器的ip。
7.3.2 link访问
(1)启动容器时,通过link参数可指定容器间的调用关系,实现容器间的互访。
(2)过程:
1)启动一个mysql容器。
2)再起一个tomcat容器,使之可以访问mysql容器,则:docker run -itd --name tomcat_link -p 8080:8080 --link mysql(这里是容器名):mysql_IP(给mysql网络起的连接别名,用于访问) -v.......
3)进入tomcat_link容器,用ping mysql_IP (别名)来验证两个容器的网络连接,能拼通。
注:安装ping命令, apt-get update, apt install iputils-ping
注:只要别名不变,不管mysql容器的ip怎么变化,都可通过别名来访问。
(3)缺点:对容器的启动顺序有要求,如果群内多个容器要互访,不方便。
7.3.3 自建bridge网络
(1)不依赖Docker默认的网络,新建一个bridge网络.
(2)命令
1)docker network create -name 网络名
2)docker network ls
3)用新建的网络启动容器
在启动命令中增加参数: --netowork 网络名 --network-alias 网络别名(给这个容器的网络起个别名,这个别名可用于后续其他容器配置连接这个容器的网络)
4)把多个容器都挂到同一个网络中,然后容器间通过别名就可以直接访问了
(3)注意:
在第二个网络的配置中,直接用第一个容器的网络别名,不用具体的IP值,即可实现容器间的连接。该方式可以有效的实现不同环境和应用访问隔离,且不依赖应用的先后顺序。
7.3.4 其他一些知识点
(1)Docker 默认创建的网卡docker0:172.17.0.1
(2)同一个物理网卡会生成多个IP
(3)启动容器时如果因为端口被占用而失败,此时重启一个的话,不能只改一个端口,名字也要改。或者先把上一步启动失败的容器删掉(虽启动失败但进程还是存在)
(4)访问网络: curl http:172.17.0.3:8081
进容器里,查看: ps -aux | grep tomcat
在宿主主机外面访问时,用的端口是映射的端口(前面那个)。在宿主主机里起的时候, curl容器ip的都是8080端口?
(5)用别名的好处:容器网络间,用别名来ping,不管这个容器的ip是不是随时变,对容器间的连接没啥影响。也可以用Inspect 容器名来查看该容器连接的网络的别名。
(6)网络隔离:不同环境下的网路,比如一个是自建bridge, 一个是默认bridge的容器,这两个容器之间拼不通 (网关也不同?),实现了网络隔离。测试有时最怕的是网络间的相互通信。规划环境时,可以运用不容网桥来规划。
(7)容器启动后是无法去修改ip的,在启动时就要指配好,容器是最小的单位,很多内容需要事先规划好。
第八章 Docker数据卷
8.1 数据卷定义
类似做一个文件夹实时共享
8.2 数据卷特点
存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的。
可以是目录也可以是文件,可利用数据卷与宿主机进行数据共享,实现容器键的数据共享和交换。
容器启动时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中。
容器对数据卷的修改是实时进行的。
数据卷的变化不会影响镜像的更新,数据卷是独立于联合文件系统,镜像是基于联合文件系统,镜像和数据卷之间不会相互影响。
8.3 容器与主机的数据交互方式
8.3.1 文件拷贝:docker cp
这是容器与宿主机的数据文件交互 的最原始的办法
命令: docker cp 源文件 目标文件 (注意:这个需要在主机里执行,不能在容器中执行)
例子1: docker cp data.txt tomcat:/usr/local/tomcat
例子2: docker cp tomcat:/usr/local/tomcat/conf/server.xml server.xml
8.3.2 数据卷:docker volume
(1)如何新建数据卷?
容器启动过程中,docker默认创建一个数据卷,位置在 /var/lib/docker/volumes/ 目录下,名称很长
创建数据卷: docker volume create - - name tomcat_volume
查看都有数据卷: docker volumes ls
查看某个数据卷信息: docker volume inspect tomcat_volume
进入数据卷的_data目录(!!!注意,数据是存放在这个_data目录下的)
(2)如何创建带数据卷的容器?
方式1: -v
docker run -itd --name tomcat_test -v tomcat_volume:/usr/local/tomcat/webapps/tomcat_volume/ -p 8080:8080 tomcat
创建后,进入容器相应目录下,创建新文件,然后在主机的数据卷目录下能否看到该文件。此时若删除容器,数据卷里的数据文件不会丢失。
方式2: --mount
两种方式的区别:-v时,如果宿主机上没有这个文件,会自动创建。--mount时,如果没有这个文件,则报错,创建失败。
(3)其他命令:
(1)docker volume inspect
查看数据卷信息
(2)docker volume ls
查看自己创建的数据卷对象
(3)docker volume prume
删除所有未被使用的数据卷对象
(4)docker volume rm
删除一个或多个数据卷对象,如果数据卷被容器引用,不管容器是否启动,都不允许被删除
8.3.3 挂载:bind mounts
(1)命令:
docker run -itd --name tomcat_test -p 8080:8080 -v $PWD/tomcat_file:/usr/local/tomcat/webapps/tomcat_file
缺点:如果源目录中有值,则会覆盖掉容器中的所有文件
第九章 大练习
9.1 题目
需要部署一套jforum应用,用于活跃日常的讨论,现已提供此应用的war包和MySQL数据库文件。请使用Docker容器快速搭建。要求: 此环境能够正常使用;要便于日后的维护;数据不能丢失。
9.2 思路
(1)war包的发布一般使用tomcat或者Nginx,数据是mysql, 所以要准备这几个环境的镜像
(2)需要配置两个容器的互访网络
(4)为了方便日后维护,war包需要做成数据卷的形式放到tomcat中发布
(5)MySQL的数据存储也要用到数据卷
(6)修改应用的数据链接文件: jforum-2.1.9/WEB-INF/config/jforum-custom.conf
(7)能够被外界正常访问
9.3 步骤
(1)下载对应的镜像,mysql用5.7版本,tomcat用最新版本
docker pull mysql:5.7
docker pull tomcat
(2)把jforum应用的war包上传到tomcat服务器,通过rz/sz命令上传 (Windows的话,用WinSCP)
(3)创建mysql数据卷
docker volume create msyql_jforum
(4)创建自定义网络:
docker network create tt_net
(5)启动mysql容器:
docker run -tid --name=mysql -p 3306:3306 -v mysql_jforum:/var/lib/mysql --network=tt_net --network-alias=mysqlip -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
(6)导入SQL数据到mysql容器:
1)复制SQL文件到mysql容器根目录下
docker cp jforum.sql mysql:/
2)配置允许远程访问mysql
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
3)创建jforum库,导入SQL文件
create database jforum;
use jforum;
source /jforum.sql;
(7)创建tomcat数据卷:
docker volume create tomcat_jforum
(8)复制jforum的war包到上面新建的tomcat数据卷中:
cp jforum-2.1.9.war /var/lib/docker/volumes/tomcat_jforum/_data/
(9)启动tomcat容器:
docker run -tid --name=tomcat -p 8080:8080 -v tomcat_jforum:/usr/local/tomcat/webapps --network=tt_net tomcat
注意:启动容器时,数据卷下的war包自动解压。
此处 tomcat 网络不需要起别名,修改配置文件时用mysql网络的别名mysqlip进行连接即可。
(10)修改应用war包的配置文件:
jforum-2.1.9/WEB-INF/config/jforum-custom.conf
(11)重启tomcat容器:
docker restart tomcat
(12)外网访问:
http://ip:8080/jforum-2.1.9/forums/list.page
9.4 练习过程中遇到的问题
(1)Jforum的war包(解压成文件夹)挂载到tomcat目录时出错。
因为挂载时路径选择为: jforum-2.1.9:/usr/local/tomcat/webapps, 这样挂载是可以成功,但是打开网络时找不到资源。
解决方案:应该在webapps下还有一个目录,比如jforum-2.19, 然后挂载到 jforum-2.1.9:/usr/local/tomcat/webapps/jforum-2.1.9,这样挂载之后,所有信息文件,都会在jforum-2.1.9目录下。打开网页时,才能找到jforum的这个资源。
数据卷目录 jforum-2.19, 生成后有_data目录,war包放到这个目录下,启动容器后才能自动解压,访问时也才能看到内容。
(2)线程池不支持最新的mysql8,需要用mysql 5.7
(3)linux传文件,建议用rz/sz, macOS用scp命令, Windows用WinSCP
macOS和centOS之间传数据:scp jforum-2.1.9.war root@192.168.56.100:~
(4)mysql容器运行总是失败,查看logs日志,好几次都是MYSQL_ROOT_PASSWORD的语句有问题,重新输入或拷贝一下这些文字。
(5)两个容器都要挂到同一个网络上才可以互通。 (配置tomcat里数据库信息时,可以直接使用mysql网络的别名)。
(6)如何导入数据库文件?
启动mysql容器,登录mysql后,选择某个数据库,使用该数据库,然后运行语句:source /jforum.sql 。
mysql数据卷通常不建议放其他的额外数据,所以建议用这个方式,拷贝到根目录或者其他目录下,再source导入。
tomcat的数据卷可以放一些额外的数据信息。
即使有远程客户端navicat,那也需要先建立数据库,再在该数据库的基础上执行jforum.sql,导入数据表等。