dokcer教材

第一章、Docker简介
1、Docker历史
Docker通过Linux Container(容器)技术将app变成一个标准化的、可移植的、自管理的组件,从而实
现应用的“一次构建,到处运行”。Docker技术特点就是:应用快速发布、部署简单、管理方便,应用密
度更高。
法裔美籍开发者和企业家 Solumon Hykes在旧金山成立一家公司,为了方便创建和管理容器,开发了一
套内部工具,最开始做DotCloud平台,即平台即服务(Plafform-as-a-Service,Paas),在2013年,公司
改名Docker,并弃用dotCloud PaaS平台,主力推广Docer和容器技术,因为这个技术确实轻量并可以很
方便的管理大量容器,马上被全球接纳,迅速发展壮大。
我们常谈的Docker,主要是指Docker引擎,它让开发者可以打包应用以及依赖包到一个可以移植的镜像
中,然后发布到任何流行的Linux系统上,实现应用“虚拟化”。
Docker引擎有两个版本:企业版EE,社区版CE。不管是EE还是CE,每个季度,都有一个新的稳定版本,
社区版会有4个月的技术支持,企业版会有12个月的技术支持。
2、容器和虚拟机
容器虚拟化的是操作系统,虚拟机虚拟化的是物理硬件。
容器更便携、更高效。
容器是应用层的抽象,它将代码和依赖项打包在一起。多个容器可以在同一台计算机上运行,并与其他
容器共享操作系统内核,每个容器在用户空间中作为隔离进程运行。容器占用的空间比 VM 少(容器映
像大小通常为 数十 MB),启动快。
虚拟机 (VM) 是将一台服务器转换为多台服务器的物理硬件的抽象。虚拟机监控程序允许多个 VM 在
一台物理计算机上运行。每个 VM 都包含操作系统、应用程序、必要的二进制文件和库的完整副本,占
用数十 GB,启动速度较慢。3、Docer安装
linux下安装
内核要大于3.10
Linux离线版安装
下载repo文件(避坑要点,大写字母O):
wget -O /etc/yum.repos.d/docker.repo http://mirrors.aliyun.com/docker
ce/linux/centos/docker-ce.repo
修改repo文件中系统版本信息:
sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker.repo
安装docker-ce:
yum -y install docker-ce
#指定版本安装
先查看可用的版本
dnf list docker-ce --showduplicates | sort -r
安装指定版本
dnf install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING>
containerd.io
https://download.docker.com/linux/static/stable/x86_64/
tar -zxvf docker-20.10.24.tgz
cp docker/* /usr/bin/
nohup dockerd & #放到后台运行
docker run hello-world3、配置Docker镜像加速
经常去官方仓库拉取镜像,网络路径是从国内路由到美国的Docker官方的镜像仓库下载,因为众所周知
的国际线路原因,速度慢,有时还断流,所以最好配置一个国内的加速服务,通过加速服务获取镜像,
这样一来,网络就会比较快
4、Docker概念
创建加速配置文件:
vim /etc/docker/daemon.json
写入以下内容
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://1ms.run",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://iju9kaj2.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com",
"https://hub.docker.com",
"http://mirrors.ustc.edu.cn"
]
}
必须daemon-reload,新配置的加速器才生效:
systemctl daemon-reload
systemctl restart docker镜像(Image):只读模板,定义了容器的运行环境(如操作系统、软件配置等)。通过分层存储
(Layer)优化空间和构建速度。
容器(Container):轻量化的运行实例,包含应用代码、运行时环境和依赖库。基于镜像创建,与其他
容器隔离,共享主机操作系统内核(比虚拟机更高效)。
仓库(Registry):存储和分发镜像的平台,如 Docker Hub(官方公共仓库)或私有仓库(如
Harbor)。
第二章、镜像与容器常用配置
1、Docker镜像
Docker镜像:是一个轻量级、独立、可执行的包,包中含有应用程序所有依赖项。我们可以自己制作镜
像,也可以从公共镜像仓库中下载别人制作好的镜像。
Docker容器:是Docker镜像的一个运行实例。它包含了应用程序、依赖项和任何其他的配置项,并且可
以独立地运行在任何的Docker主机上。
2、镜像搜索
docker官方提供了镜像仓库,仓库叫做docker hub,docker hub的地址是 https://registry.hub.docker.
com 或https://hub.docker.com/,我们可以在仓库中搜索所需的镜像,下载到本地使用,也可以上传自
己制作的镜像,供其它用户下载使用。
打开docker镜像官网,输入nginx,可以得到以下结果。
1处表示应用名
2处Official Image表示官方仓库,即nginx官方仓库
3处表示下载数量,1B+表示10亿+,10M+表示千万+
4处表示这个镜像,大家的喜好程序
点击1处,会打开一个新的页面,右上角,有个命令docker pull nginx。3、镜像拉取
docker pull,表示拉取镜像到本地。
一般我们下载镜像,如果没有特殊要求,都选官方镜像,主要是官方可靠,安全性好,如果有其它要
求,并且非官方镜像可以满足,并且我们也信用它的话,也可以下载到本地使用。
4、镜像启动
在Docker中,使用docker pull命令可以从Docker Hub或其他支持的注册中心拉取(下载)一个镜像。以
下是docker pull命令的基本用法:
1. 拉取官方镜像
如果你想要拉取一个官方的Docker镜像,例如拉取最新的Ubuntu镜像,你可以使用:
docker pull ubuntu
默认情况下,这会拉取ubuntu的最新版本。
2. 拉取特定版本的镜像
如果你想要拉取特定版本的镜像,可以在镜像名称后面加上:和版本号。例如,拉取Ubuntu的18.04版本:
docker pull ubuntu:18.04
3. 拉取私有仓库中的镜像
如果你想要从私有仓库拉取镜像,你需要指定完整的仓库地址。例如,从Docker Hub上的某个用户仓库拉取镜
像:
docker pull username/repository-name:tag
例如,拉取某个用户的nginx镜像:
docker pull myusername/nginx:latest
4. 使用Docker Hub之外的注册中心
如果你的镜像存储在非Docker Hub的注册中心(例如阿里云、腾讯云等),你需要在命令中指定完整的镜像
URL。例如,从阿里云容器镜像服务拉取镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
5. 查看可用的标签(tags)
在拉取之前,如果你想查看一个镜像有哪些可用的标签(即版本),可以先使用docker search命令(对于私
有仓库,可能需要登录后查看),或者使用Docker Hub的网页界面。对于私有仓库,通常需要登录后才能看到
标签列表:
docker login registry-url
docker search username/repository-name # 对于公有仓库
或者,直接访问注册中心的网页版UI来查看。
docker run nginx5、容器命令
5.1、docker run|stop|start
镜像运行,停止,从停止到运行
docker run后,如果容器没有提供服务,会立即停止,退出。
5.2、Docker ps
查看正运行的容器
5.3、docker exec
进入容器
docker run [option] image
# option参数说明
--name="Name" #对运行的容器定名字,常用
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容-it = -i + -t
-p #小写p,指定容器的端口
-P #大写P,随机指定端口
docker run nginx:1.24.0
docker ps #查看当前运行的容器
Docker ps -a #查看当前运行及以前运行过的容器
docker ps -aq #查看容器ID
docker exec -it nginx bash #进入正在执行的容器,启用新的终端进程,进行操作
nginx为容器名称
bash为linux终端交互
#显示当前路径
pwd
# 退出,从容器中退回主机
exit5.4、docker rm
删除指定容器,正在运行的容器不能删除
5.5、 docker container inspect
查看容器细节
第三章、Docker网络与通讯原理
1、docker默认网络
Docker启动时会自动在后台创建三个网络,docker network ls命令可以查询网络信息。
bridge,host宿主机上会有一个docker0的虚拟网卡,如果我们启动容器的时候不指定网络,那么
docker就会新建一个虚拟网卡桥接在docker0上,容器自己也会新建一个虚拟网卡,这两个虚拟网卡一
对一绑定,这样一来容器和宿主机以及容器与容器之间可以相互通信,这种虚拟网卡的桥接技术被称为
evth-pair技术。
docker rm -f 容器ID #删除指定容器
docker rm -f $(docker ps -aq) #删除所有容器
docker ps -aq|xargs docker rm #删除所有容器
[root@alma88-176 opt]# docker network ls
NETWORK ID NAME DRIVER SCOPE
15f02f8d4ece bridge bridge local
796fcca87cbd host host local
f6947532cc9a none null local
[root@alma88-176 opt]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> 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: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group
default qlen 1000
link/ether 00:50:56:90:17:50 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet 192.168.50.176/24 brd 192.168.50.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe90:1750/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
group default
link/ether 02:42:e2:23:cb:80 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 foreverhost,共用宿主机host的网络资源,如IP,DNS等等信息,要注意的是容器开放的端口要避免与host造
成端口冲突。
none,没有网络,若容器启动的时候指定使用它,docker run -it --network=none imagename`,那么
就代表这是一个隔离的容器,无法与外界进行交互。
2、容器对外服务
docker暴露服务/端口
容器中应用,要让外部也可以访问,可通过 -P(大写) 或 -p (小写) 参数进行端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
使用 docker ps 可以看到
-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有
hostPort:containerPort、ip:hostPort:containerPort、 ip::containerPort。
#暴露端口
docker run -p <host_port>:<container_port> 容器名 #-p(小写) 表示按指定主机端口:容器端
口进行NAT映射
docker run -P
#查看端口暴露
docker ps -l3、创建网络
docker network create prestashop-network
容器的IP地址并不固定,每次重启都有可能发生变更,容器之间用IP相互通信就会存在问题,于是大家就
想到了用服务名(容器名)进行通讯。
自定义网络就出现了,它可以解决容器之间用服务名(容器名)通信问题。
自定义网络
创建自定义网络appnet。
docker network create --driver bridge --subnet 172.30.0.0/16 --gateway 172.30.0.1 appnet
--driver bridge指定使用网络的类型,可以选择none,host,bridge任何一种;
--subnet 172.30.0.0/16指定子网的范围;
--gateway 172.30.0.1指定网关的地址;
然后我们查看网络docker network ls就可以看到刚刚创建的自定义网络了。
第四章、Docker数据卷
1、数据卷概述
通过镜像,我们启动容器,通过端口暴露,我们可以访问容器里的服务,但当我们停止容器或删除容器
后,容器运行中产生的数据也随之丢失了,为了解决容器运行时产生的数据做持久化保存,我们需要通
过容器数据卷来实现。
#查看iptables相关链信息
[root@r88-82 docker]# iptables -t nat -L -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst
type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 172.17.0.0/16 0.0.0.0/0
MASQUERADE tcp -- 172.17.0.2 172.17.0.2 tcp dpt:80
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst
type LOCAL
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0
DNAT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:32768
to:172.17.0.2:80数据卷就是把容器内的目录挂载到linux母机目录,容器里这个目录下的数据写入,会实时同步到母机目
录,因为因为母机目录独立于容器,所以它的数据不受容器生命周期影响。数据卷的引入,给容器带来
了以下好处:
容器产生的数据可以持久化保存,数据实际只保存一份在宿主机上
Linux母机可以与容器间接通信,不论哪侧修改,数据都实时生效
容器与容器之间可以进行数据交换,数据卷可以同时给多个容器挂载
2、数据覆盖
因为是挂载技术,涉及到数据覆盖问题
1、如果是把linux母机的一个空目录挂载到容器中一个非空目录,那容器中的目录数据会被复制到Linux
母机的目录中
2、如果是把linux母机的一个非空目录挂载到容器中的一个目录中,不管容器中这个目录有没有数据,在
容器里都会显示母机的数据卷数据,如果容器中目录有数据,这些数据会临时被隐藏。
3、挂载命令
4、卷映射
卷映射(Volume Mount)是Docker将数据卷挂载到容器内部指定路径的机制,实现容器与存储实体的
关联。数据卷由Docker统一管理,生命周期独立于容器
第五章、Docker部署电子商城
1、安装docker
yum -y update #升级系统包
增加docker源
[root@localhost ~]# yum config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/cen
tos/docker-ce.repo
docker run -v /linux母机目录:/容器内目录 镜像名
案例
docker run -d -p 2025:80 -v /web/html:/usr/share/nginx/html --name nginx03 nginx
docker run -d -p 2025:80 -v /web/html:/usr/share/nginx/html -v ngconf:/etc/nginx
--name nginx03 nginx增加docker源地址
[root@localhost ~]# sed -i 's/$releasever/7/g' /etc/yum.repos.d/docker-ce.repo
加载缓存
[root@localhost ~]# yum makecache
查看可安装的docker版本
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
安装docker
[root@localhost ~]# yum -y install docker-ce-26.1.4 #自己选择,版本不要太久,也不要太新
2、配置镜像加速
[root@localhost docker]# vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://1ms.run",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://iju9kaj2.mirror.aliyuncs.com",
"http://hub-mirror.c.163.com",
"https://cr.console.aliyun.com",
"https://hub.docker.com",
"http://mirrors.ustc.edu.cn"
 
]
}
启动docker
systemctl daemon-reload
systemctl restart docker
3、使用 Docker 部署 PrestaShop及MySQL 数据库
# 创建自定义网络,方便容器互联,后面商城数据库地址可以写数据库的容器名称
docker network create prestashop-network# 启动 MySQL 容器(存储数据库)
docker run -d \
--name prestashop-mysql \ #运行后的容器名
--network prestashop-network \ #加入到自定义网络
-p 3306:3306 #映射端口
-e MYSQL_ROOT_PASSWORD=123456 \ #简单密码方便测试
-e MYSQL_DATABASE=prestashop \ #新建库
-e MYSQL_USER=psuser \ #新建专用用户
-e MYSQL_PASSWORD=123456 \ #密码
--default-authentication-plugin=mysql_native_password \ # 解决兼容问题,随意加
mysql:5.7
prestashop版本(8.2.1)
# 启动 PrestaShop 容器
docker run -d \
--name prestashop \
--network prestashop-network \
-p 8080:80 \
-e DB_SERVER=prestashop-mysql \ #因为容器在同一网络可以使用容器名代替IP
-e DB_NAME=prestashop \
-e DB_USER=psuser \
-e DB_PASSWORD=123456 \ #对应上面mysql设置的数据库,用户,密码
docker.1ms.run/prestashop/prestashop:latest
#\后面不要有空格
-e 环境变量
-p 端口映射
用浏览器登录(ip+8080)进行初始化配置,按照引导,一步到底
posted @ 2025-08-28 21:12  傲云萧雨  阅读(10)  评论(0)    收藏  举报