伴随着信息技术的飞速发展,虚拟化技术早已经广泛应用到各种关键场景中。
部署、交付、运行
传统来看,虚拟化(vm)既可以通过硬件模拟来实现,也可以通过操作系统软件来实现。而容器技术则 更为优雅,它充分利用了操作系统本身已有的机制和特性,可以实现远超传统虚拟机的轻量级虚拟化。 因此,有 人甚至把它称为“新一代的虚拟化”技术,并将基于容器打造的云平台亲切地称为“容器云”。CI CD
本章内容包括Docker的起源发展、快速实战、核心原理、高级实战及运维管理,会由浅入深的讲解 Docker的技术知识和实战、运维。
Docker概述
容器化和虚拟化
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化。(百度百科)
虚拟化
在最早的时候,我们想要在线上部署一个应用。我们需要先购买服务器,然后安装操作系统及各种依赖 环境,最后进行应用的部署。
问题:
- 部署应用上线应用过程时间非常长
- 购买服务器的花费不菲
- 物理服务器的资源容易浪费
- 迁移和扩展比较困难
因为有上面的问题,后来出现的虚拟化技术。 虚拟化技术就是在操作系统上多加了一个虚拟化层 (Hypervisor),可以将物理机的CPU、内存、硬盘、网络等资源进行虚拟化,再通过虚拟化出来的空 间上安装操作系统,构建虚拟的应用程序执行环境。这就是我们通常说的虚拟机。
比如:VMware 、VirtualBox、KVM等。
虚拟化技术的优点:
- 提升IT效率
- 降低运维成本
- 更快地部署工作负责
- 提高应用性能
- 提高服务器可用性
- 消除服务器梳理剧增情况和复杂性
虚拟机的缺点:
- 占用资源较多
- 性能较差
- 扩展能力较差
- 环境迁移能力较差
于是容器化技术诞生了。
容器化
容器化起源集装箱。集装箱 ——全球物流系统中一个非常重要的发明。在运输之前一次性将货物封装好 到集装箱里面,之后的集装箱直接放到卡车、火车、货轮上,而且集装箱是统一标准的,自然容易机械 化,因此集装箱的革命,节省了大量的资源、物流成本大大降低。
借鉴了集装箱的解决方案,提出了类似集装箱的方式封装应用以及它的运行环境,将应用和环境打包成 一个轻量化、可移植、自包含的容器。
容器是轻量级的,因为它们不需要虚拟机管理程序的额外负载,而是直接在主机的内核中运行。
这意味着与使用虚拟机相比,可以在给定的硬件组合上运行更多的容器。
甚至可以在实际上是虚拟机的主机中运行Docker容器
容器有四个特点:
- 容器共享宿主机内核
- 容器使用内核的功能对进程进行分组和资源限制
- 容器通过命名空间保证隔离
- 容器像是轻量级的VM(占用空间更少,速度更快),但不是虚拟机
Docker概述
什么是Docker
- Docker开源项目背景
Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最 初发起者是dotCloud公司 (Docker Inc)
Docker项目已加入了Linux基金会,并遵循Apache2.0协议,全部开源代码均在https://github.co m/docker/docker上进行维护。
Docker的构想是要实现“Build,Ship and Run Any App, Anywhere”,即通过对应用的封装 (Packaging)、分发 (Distribution)、部署(Deployment)、运行(Runtime)生命周期进 行管理,达到应用组件“一次封装,到处运行”的目的。这里的应用组 件,既可以是一个Web应用、 一个编译环境,也可以是一套数据库平台服务,甚至是一个操作系统或集群。
Docker首次为应用的开发、运行和部署提供了“一站式”的实用解决方案。 - Linux容器技术(LXC)
早期的Docker是基于Linux容器技术(Linux Containers,LXC)的。
最早的容器技术可以追溯到1982 年Unix系列操作系统上的chroot工具(直到今天,主流的Unix、 Linux操 作系统仍然支持和带有该工具)。早期的容器实现技术包括Sun Solaris 操作系统上的 Solaris Containers(2004年发布),FreeBSD操作系统上的 FreeBSD jail(2000年左右出现), 以及GNU/Linux上的Linux-VServer和 OpenVZ。 - 从Linux容器到Docker
在LXC的基础上,Docker进一步优化了容器的使用体验
Docker提供了各种容器管理工具(如分发、版本、移植等)让用户无需关注底层的操作,可以更简 单明了地管理和使用容器
Docker通过引入分层文件系统构建(aufs)和高效的镜像机制,降低了迁移难度,极大地提升了用 户体验。
自0.9版本开始,Docker 开发了libcontainer项目,作为更广泛的容器驱动实现,从而替换掉了 LXC的实现
Docker的应用场景
快速,一致地交付应用程序、镜像打包环境,避免了环境不一致的问题
Docker可以为开发人员提供 标准化 的本地工作环境给应用程序和服务,从而简化了开发生命周期。容器 非常适合持续集成和持续交付(CI / CD)工作流程
如果有以下场景可以使用Docker交付:
- 开发人员在本地编写代码,并使用Docker容器与其他同事共享劳动成果。
- 使用Docker将应用程序推送到测试环境中,并执行自动和手动测试。
- 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中以 进行测试和验证。
- 测试完成后,将修补程序推送给生产环境就像将更新的镜像推送到生产环境一样简单。
响应式部署和扩展
Docker是基于容器的平台允许高度可移植的工作负载。Docker容器可以在开发人员的本地笔记本电脑 上,数据中心中的物理或虚拟机上,云提供商上或混合环境中运行。
Docker的可移植性和轻量级的特性还使可以轻松地动态管理工作负载,并根据业务需求指示实时扩展或 拆除应用程序和服务。
在同一个硬件上运行更多工作负载
Docker轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行,经济高效的替代方案,因此我们可以 利用更多的计算能力来实现业务目标。Docker非常适合于高密度环境以及中小型部署,而需要用更少的 资源做更多的事情。
为什么要使用Docker
Docker容器虚拟化的好处
Docker提供了一种更为聪明的方式,通过容器来打包应用,解耦
应用和运行平台。意味着迁移的时候,只需要在新的服务器上启动需要
的容器就可以了,无论新旧服务器是否是同一类型的平台。
Docker在开发和运维中的优势
- 更快速的交付和部署
- 更高效的资源利用
- 更轻松的迁移和扩展
- 更简单的更新管理
- 提供完整的软件生态系统: 镜像管理、资源隔离、文件系统、网络隔离、流程管理及服务发现
Docker与虚拟机比较
Docker是一种轻量级的虚拟化方式。与传统虚拟机技术的特性比较如下表:
传统的虚拟机方式提供的是相对封闭的隔离。Docker利用Linux系统上的多种防护技术实现了严格的隔 离可靠性,并且可以整合众多安全工具。从 1.3.0版本开始,Docker重点改善了容器的安全控制和镜像 的安全机制, 极大提高了使用Docker的安全性。
Docker快速实战
Docker核心组件
Docker引擎
Docker使用客户端-服务器架构
Docker客户端是用户与Docker交互的主要方式,与Docker守护进程(Docker引擎)进行通信
该守护进程完成了构建,运行和分发Docker容器的繁重工作
Docker客户端和守护程序可以在同一系统上运行,也可以将Docker客户端连接到远程Docker守护程 序。
Docker客户端和守护程序在UNIX套接字或网络接口上使用REST API进行通信。
Docker守护进程侦听Docker API请求并管理Docker对象,例如镜像,容器,网络和卷等。
守护程序还可以与其他守护程序通信以管理Docker服务
Docker镜像
Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
镜像是基于联合(Union)文件 系统的一种层式的结构,由一系列指令一步一步构建出来。
比如:
- 添加一个文件;
- 执行一个命令;
- 打开一个端口。
镜像是创建Docker容器的基础。通过版本管理和增量的文件系统, Docker提供了一套十分简单的机制 来创建和更新现有的镜像,用户可以从网上下载一个已经做好的应用镜像,并直接使用
我们可以利用Dockerfile构建自己的镜像。
Docker容器
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。
容器是镜像的一个运行实例。
可以将其启动、开始、停止、删除,而这些容器都是彼此相互隔离的、互不可见的。
可以把容器看做是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间 等)以及运行在其中的应用程序打包而成的盒子。
容器是基于镜像启动起来的,容 器中可以运行一个或多个进程。
镜像是Docker生命周期 中的构建或打包阶段,而容器则是启动或执行阶段。
镜像自身是只读的。容器从镜像启动的时候,会在镜像的最上层创建一个可写层。
Docker仓库
Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。
仓库注册服务器(Registry)是存放仓库的地方,其上往往存放着多个仓库
每个仓库集中存放某一类镜像,往往包 括多个镜像文件,通过不同的标签(tag)来进行区分
根据所存储的镜像公开分享与否,Docker仓库可以分为公开仓库 (Public)和私有仓库(Private)两种 形式。
目前,最大的公开仓库是 官方提供的Docker Hub,其中存放了数量庞大的镜像供用户下载。
国内不少云服务提供商(如时速云、阿里云等)也提供了仓库的本地源,可以提供稳定的国内访问。
Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。
Docker安装
Docker在主流的操作系统和云平台上都可以使用,包括Linux操作 系统(如Ubuntu、Debian、 CentOS、Redhat等)、MacOS操作系统和 Windows操作系统,以及AWS等云平台。
1) 卸载历史版本
#查看安装
yum list installed | grep docker
#卸载
yum -y remove containerd.io.x86_64
yum -y remove docker-ce.x86_64
yum -y remove docker-ce-cli.x86_64
#删库
rm -rf /var/lib/docker
2) 安装官方yum源
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/dockerce.repo
3) 安装Docker引擎
yum install -y docker-ce docker-ce-cli containerd.io
4) 启动docker
#开机启动
systemctl enable docker
#启动
systemctl start docker
#查看Docker状态
docker info
Docker操作
使用Docker镜像
获取镜像
docker pull NAME[:TAG] (拉取最新的镜像)
Dockerhub
描述一个镜像需要包括“名称+标签”信息
例如:
docker pull mysql:5.7.30
[root@localhost ~]# docker pull mysql:5.7.30
5.7.30: Pulling from library/mysql
# 镜像文件一般由若干层(layer)组成 层的唯一id镜像文件一般由若干层(layer)组成
8559a31e96f4: Pull complete
d51ce1c2e575: Pull complete
c2344adc4858: Pull complete
fcf3ceff18fc: Pull complete
16da0c38dc5b: Pull complete
b905d1797e97: Pull complete
4b50d1c6b05c: Pull complete
d85174a87144: Pull complete
a4ad33703fa8: Pull complete
f7a5433ce20d: Pull complete
3dcd2a278b4a: Pull complete
如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。
镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,默认使用的是Docker Hub服务,该前缀可以忽略
docker pull registry.hub.docker.com/mysql:5.7.30
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址
查看镜像信息
docker images
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
mysql 5.7.30 9cfcce23593a 6 weeks ago
448MB
可以通过man docker-images查看更多命令参数
添加镜像标签
docker tag [原镜像名:tag号] [目标镜像名:tag号] # 如果tag号缺省,默认latest
[root@localhost ~]# docker tag mysql:5.7.30 mysql5
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
mysql5 latest 9cfcce23593a 6 weeks ago
448MB
mysql 5.7.30 9cfcce23593a 6 weeks ago
448MB
查看镜像详细信息
docker inspect NAME[:TAG]
[root@localhost ~]# docker inspect mysql:5.7.30
[
{
"Id":
"sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a",
"RepoTags": [
"mysql:5.7.30"
],
"RepoDigests": [
"mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854"
],
"Parent": "",
"Comment": "",
"Created": "2020-06-09T07:21:19.100938536Z",
"Container":
"0b42e56165f339e2bf9e1799e0125db6fbb1f54a24a79c1b4d621248bc24927a",
"ContainerConfig": {
"Hostname": "0b42e56165f3",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.30-1debian10"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"mysqld\"]"
],
"ArgsEscaped": true,
"Image":
"sha256:b978dc18619b1ca9b160e4f1592465b0450973794b7a0e4bd149d4453f5256be",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "18.09.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"3306/tcp": {},
"33060/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"MYSQL_MAJOR=5.7",
"MYSQL_VERSION=5.7.30-1debian10"
],
"Cmd": [
"mysqld"
],
"ArgsEscaped": true,
"Image":
"sha256:b978dc18619b1ca9b160e4f1592465b0450973794b7a0e4bd149d4453f5256be",
"Volumes": {
"/var/lib/mysql": {}
},
"WorkingDir": "",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 448082853,
"VirtualSize": 448082853,
"GraphDriver": {
"Data": {
"DeviceId": "12",
"DeviceName": "docker-8:3-1784452-
7877d481a821545822e9ced737187d7f95804b5cf1594725538ccdfe66d3dbfc",
"DeviceSize": "10737418240"
},
"Name": "devicemapper"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74",
"sha256:365386a39e0ea80fcf2a4e3a3cd0e490f073d976133b96dd7f5e2cd1579a8ff5",
"sha256:c3f46b20a0d3c6532ec63cb2f5475a0a33c8e4c2f22a0a2184d7d79d2f970b37",
"sha256:66c45123fd43c21cc8be641b73bf2747adf326c6e07d08eadf9b6c829ad575b3",
"sha256:61cbb8ea64815ee524388e222d32855953ff71bce2a2049185232b3c0463fa93",
"sha256:44853bb6727490ada4379f3348acbf52b3e7abb63427ce42ca118e11a7b94018",
"sha256:3a2464d8e0c0697f6fb252a602a6ab95542e5ad10aacc9277d269a182db8dc30",
"sha256:91ae264962fbfc55b25a1b59378024ef08833c7003823136e73f43985ecda5ee",
"sha256:8f0182ef7c8cff5ae6b305dff6d7555a249a1e24bfbd94e4f25e75090e763ae3",
"sha256:ac76579057880b4e115cc46f952aa9b1c92f1f2adbca8ebba810951200e9c288",
"sha256:c90a34afcab00e4d70d1672b27c4780f6eb881b6cd51c3da492497b15be0b24d"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
返回的是一个JSON格式的消息,如果我们只要其中一项内容时, 可以使用参数-f来指定
[root@localhost ~]# docker inspect mysql:5.7.30 -f {{".Architecture"}}
amd64
搜寻镜像
docker search 名称
[root@localhost ~]# docker search mysql
NAME DESCRIPTION
STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source
relation… 9760 [OK]
mariadb MariaDB is a community-developed fork of
MyS… 3564 [OK]
mysql/mysql-server Optimized MySQL Server Docker images.
Create… 717 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server
78
mysql/mysql-cluster Experimental MySQL Cluster Docker images.
Cr… 73
dockerhub仓库镜像, 私有仓库无法搜索到
删除镜像
docker rmi NAME[:TAG]
[root@localhost ~]# docker rmi mysql:5.7.30
Untagged: mysql:5.7.30
Untagged:
mysql@sha256:32f9d9a069f7a735e28fd44ea944d53c61f990ba71460c5c183e610854ca4854
# 当同一个镜像拥有多个标签的时候,docker rmi命令只
# 是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
mysql5 latest 9cfcce23593a 6 weeks ago
448MB
#当镜像只剩下一个标签的时候,使用docker rmi命令会彻底删除镜像
[root@localhost ~]# docker rmi mysql5:latest
Untagged: mysql5:latest
Deleted: sha256:9cfcce23593a93135ca6dbf3ed544d1db9324d4c40b5c0d56958165bfaa2d46a
Deleted: sha256:98de3e212919056def8c639045293658f6e6022794807d4b0126945ddc8324be
Deleted: sha256:17e8b88858e400f8c5e10e7cb3fbab9477f6d8aacba03b8167d34a91dbe4d8c1
Deleted: sha256:c04c087c2af9abd64ba32fe89d65e6d83da514758923de5da154541cc01a3a1e
Deleted: sha256:ab8bf065b402b99aec4f12c648535ef1b8dc954b4e1773bdffa10ae2027d3e00
Deleted: sha256:09687cd9cdf4c704fde969fdba370c2d848bc614689712bef1a31d0d581f2007
Deleted: sha256:b704a4a65bf536f82e5d8b86e633d19185e26313de8380162e778feb2852011a
Deleted: sha256:c37206160543786228aa0cce738e85343173851faa44bb4dc07dc9b7dc4ff1c1
Deleted: sha256:12912c9ec523f648130e663d9d4f0a47c1841a0064d4152bcf7b2a97f96326eb
Deleted: sha256:57d29ad88aa49f0f439592755722e70710501b366e2be6125c95accc43464844
Deleted: sha256:b17c024283d0302615c6f0c825137da9db607d49a83d2215a79733afbbaeb7c3
Deleted: sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74
使用镜像ID删除镜像
docker rmi IMAGE ID
REPOSITORY TAG IMAGE ID CREATED
SIZE
tomcat 8.5.56-jdk8-openjdk e010d327a904 6 weeks ago
529MB
mysql5 latest 9cfcce23593a 6 weeks ago
448MB
mysql 5.7.30 9cfcce23593a 6 weeks ago
448MB
[root@localhost ~]# docker rmi 9cfcce23593a
Error response from daemon: conflict: unable to delete 9cfcce23593a (must be
forced) - image is referenced in multiple repositories
如果有容器正在运行该镜像,则不能删除
如果想强行删除用 -f (不推荐)
上传镜像
docker push NAME[:TAG]
上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登录)
操作Docker容器
创建容器
docker create NAME[:TAG]
可以加选项参数
- -i 交互模式
- -t 伪终端
- -d 后台运行
- -rm 容器退出后是否自动删除
docker create -it nginx
启动容器
docker start 容器id
docker start 9cfcce23593a
查看容器状态
docker ps 查看运行的容器
#查看运行的容器
docker ps
#查看所有容器
docker ps -a
新建并启动容器
docker run NAME[:TAG]
相当于 docker create+docker start
docker run -it --rm --network host tomcat:8.5.56-jdk8-openjdk
可以加选项参数
- --network host 使用宿主机IP地址
- man docker run
- docker run --help
终止容器
docker stop 容器id -t 时间 (默认10秒)
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10 秒)后,再发送SIGKILL信号来终止容器 docker kill 容器id
docker kill命令会直接发送SIGKILL信号来强行终止容器
docker stop ce554267d7a4 -t 5
docker kill ce554267d7a4
处于终止状态的容器,可以通过docker start命令来重新启动
docker start ce554267d7a4
docker restart命令会将一个运行态的容器先终止,然后再重新启动
docker restart ce5
进入容器
docker exec -it [容器ID] /bin/bash
早期有attach命令,对于阻塞命令会等待,所以不方便
在Docker 1.3.0后提供了exec 可以在容器内直接执行任意命令
docker exec -it 243c32535da7 /bin/bash
无论在容器内进行何种操作,依据依据镜像创建的其他容器都不会受影响(由于namespace的隔离)(将 数据持久化的除外)
exec: 容器执行某操作,操作为容器ID后边的命令
-it: 以伪终端模式,这样我们就相当于进入到容器中了
查看容器
docker inspect [容器ID]
docker inspect 243c32535da7
docker stats [容器ID]
docker stats 243c32535da7
删除容器
docker rm [容器ID]
docker rm 243c32535da7
docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器
要直接删除一个运行中的容器,可以添加-f参数。Docker会先 发送SIGKILL信号给容器,终止其中的应 用,之后强行删除
访问Docker仓库
Docker Hub是最大的公共镜像仓库
在公共仓库中注册一个账号,每ID可以免费拥有1个私有镜像
登录仓库
docker login -u username -p password
默认登陆的是docker hub
[root@localhost ~]# docker login -u gavinli80s -p ljp123465
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
登录成功的用户可以上传个人制造的镜像。
用户无需登录即可通过docker search命令来查找官方仓库中的镜 像,并利用docker pull命令来将它下 载到本地
登出仓库
docker logout
可以同时登陆多个docker仓库,因此此命令一般不执行
[root@localhost ~]# docker logout
Removing login credentials for https://index.docker.io/v1/
认证文件
Mac/Win机器上的是隐藏密码的,但是在Linux下是显示密码的,只不过进行了base64编码, 只要拷贝此 文件到其他机器指定目录下(/root/.docker/config.json)即可免登录
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "Z2F2aW5saTgwczpsanAxMjM0NjU="
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.12 (linux)"
}
}
常用软件的容器化部署
Mysql
docker pull mysql:5.7.30
docker run --network host -e MYSQL_ROOT_PASSWORD=root -d --rm mysql:5.7.30
- --network host : 宿主机IP 不能再使用端口映射 -p 宿主机端口:容器端口 只能使用容器端口
- --rm:当容器停止后,对容器及其申请的卷执行删除操作
- -e key=value: 指定环境变量(此处指定了mysql root密码的环境变量,密码为root)
- -d :后台运行
访问MySQL
[root@localhost ~]# mysql -h192.168.72.129 -uroot -proot
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.30 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
Tomcat
docker pull tomcat:8.5.56-jdk8-openjdk
docker run -it --rm --network host tomcat:8.5.56-jdk8-openjdk
- -it : 交互式伪客户端
- --rm:当容器停止后,对容器及其申请的卷执行删除操作
- --network host:宿主机IP
访问tomcat
[root@localhost ~]# curl http://192.168.72.129:8080/
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not
Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;}
h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2
{font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line
{height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP
Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p>
<p><b>Description</b> The origin server did not find a current representation for
the target resource or is not willing to disclose that one exists.</p><hr
class="line" /><h3>Apache Tomcat/8.5.56</h3></body></html>[root@localhost ~]#
创建一个webapp
进入到运行中的容器tomcat:8.5.56-jdk8-openjdk
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
0813f630621b tomcat:8.5.56-jdk8-openjdk "catalina.sh run" 14
minutes ago Up 14 minutes stupefied_stonebraker
d93be60e1ed6 mysql:5.7.30 "docker-entrypoint.s…" 20
minutes ago Up 20 minutes gracious_tharp
[root@localhost ~]# docker exec -it 08 /bin/bash
root@localhost:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp
webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib
webapps work
root@localhost:/usr/local/tomcat# cd webapps
root@localhost:/usr/local/tomcat/webapps# ls
root@localhost:/usr/local/tomcat/webapps# mkdir app1
root@localhost:/usr/local/tomcat/webapps# cd app1
root@localhost:/usr/local/tomcat/webapps/app1# echo Hello Docker > index.html
Nginx
docker pull nginx
docker run --name nginx1 --network host -d nginx
--name:运行的容器名称
访问nginx
Redis
docker pull redis:5.0.9
docker run --network host -d redis:5.0.9
访问Redis
[root@localhost ~]# cd /var/redis-cluster/7001/bin/
[root@localhost bin]# ./redis-cli -h 192.168.72.129
192.168.72.129:6379>
#本机访问
[root@localhost ~]# docker exec -it 73 redis-cli
127.0.0.1:6379>