Docker入门(三)

本文详细介绍了Docker的基础知识,包括Linux命令、Docker的容器化与虚拟化概念、Docker架构及其优势。讲解了Docker的安装、仓库管理、镜像操作、容器创建与管理、网络配置以及数据卷的使用。通过实例演示了如何在不同网络模式下实现容器间的互访,并给出了大型项目练习,涉及多容器环境的部署和数据持久化。
摘要由CSDN通过智能技术生成

目录

第一章 Linux命令

第二章 Dcoker简介

2.1 容器化与虚拟化

2.2 Docker 简介

2.3 Docker架构

2.4 为什么要使用Docker

2.5 Docker基础概念

第三章 安装Docker

第四章 Docker仓库

第五章 Docker镜像

5.1 什么是镜像

5.2 镜像常见操作

第六章 Docker容器

6.1 什么是容器

6.2 创建容器

6.3 查看容器

6.4 进入容器

6.5 停止容器

6.6 重启容器

6.7 删除容器

6.8 修改容器

6.9 查看容器日志

6.10 查看容器信息

第七章 Docker网络

7.1 容器网络配置

7.2 几种常见网络模式

7.2.1 Host

7.2.2 Bridge

7.2.3 None

7.2.4 Container

7.2.5 自定义网络(工作中用的最多)

7.3 容器间的互访

7.3.1 虚拟ip访问

7.3.2 link访问

7.3.3 自建bridge网络

7.3.4 其他一些知识点

第八章 Docker数据卷

8.1 数据卷定义

8.2 数据卷特点

8.3 容器与主机的数据交互方式

8.3.1 文件拷贝:docker cp

8.3.2 数据卷:docker volume

8.3.3 挂载:bind mounts

第九章 大练习

9.1 题目

9.2 思路

9.3 步骤

9.4 练习过程中遇到的问题


第一章 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,导入数据表等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值