Docker入门
时间:2023-02-17 13:00:00
目录
一、Docker概述
1.1 Docker为什么?
1.2 Docker历史
1.3 容器vs虚拟机
1.4 聊聊Docker
1.5DevOps(开发、运维)
二、Docker安装
2.1 Docker基本组成
2.2 环境准备
2.2.1 安装xshell
2.2.2 Centos安装
2.3 安装Docker
2.4卸载docker
2.5阿里云镜像加速
三、底层原理
3.1 Docker怎样工作?
3.2 Docker为什么比VM快?
四、Docker常用命令
4.1 帮助命令
4.2 镜像命令
4.3 容器命令
4.4 其他命令常用
五、作业练习
5.1Docker 安装Nginx
5.2 docker 安装tomcat
5.3 Docker安装部署elasticsearch kibana
5.4使用kibana连接es (elasticSearch)?思考网络如何连接
六、安装可视化面板
七、Docker镜像
7.1 联合文件系统原理
7.2 分层理解
7.3 commit提交镜像
八、容器数据卷
8.1 什么是容器卷?
8.2 使用数据卷
8.3 实战安装MySQL
8.4 具名和匿名挂载
8.5 初识Dockerfile
8.6 数据卷容器
九、DockerFile
9.1 官方DockerFile示例
9.2 DockerFile构建过程
9.3 DockerFile的指令
9.4 实战构建自己的centos
9.5 CMD与ENTRYPOINT区别
9.6 实战Tomcat镜像
9.7 发布自己的镜像
9.8 小结
十、Docker 网络
10.1 理解Docker 0
10.2 –-link
10.3自定义网络
10.4 网络联通
十一、SpringBoot微服务打包Docker镜像
一、Docker概述
1.1 Docker为什么出现?
原先开发一款产品: 开发和上线两套环境!这两套环境都需要配置应用环境,应用配置!
开发人员和运维人员早期项目上线的时候。开发人员在我的电脑上是可以运行的!而在运维人员电脑却不能运行。随着版本更新,导致服务不可用!对于运维来说考验十分大?
早期部署项目,环境配置是十分的麻烦,每一个及其都要部署环境(集群Redis、ES、Hadoop…) !费事费力。
如果发布一个项目( jar + (Redis MySQL JDK ES) ),项目能不能带上环境安装打包!就可以提高上线的效率,减轻运维人员的压力。
之前在服务器配置一个应用的环境 Redis MySQL JDK ES Hadoop 配置超麻烦了,不能够跨平台。
开发环境Windows,最后发布到Linux!
传统:以前开发人员开发好的项目打成jar包,给运维来部署上线,配置应用环境耗时费力!
现在:开发人员通过Dockerfile制作镜像打包部署上线,一套流程做完!
安卓流程:java — apk —发布(应用商店)一 张三使用apk一安装即可用!
docker流程: java-jar(环境) — 打包项目帯上环境(镜像) — ( Docker仓库:商店)-----
所以,Docker给以上的问题,提出了解决方案!
使用Docker后的流程:
开发:建立模型--环境--打包带上环境,即镜像--放到Docker仓库
部署:下载Docker中的镜像,直接运行即可
Docker的思想来自于集装箱,集装箱,对环境进行隔离
Docker通过隔离机制,可以将服务器利用到极致。
本质:所有的技术都是因为出现了一些问题,我们需要去解决,才去学习!
1.2 Docker历史
2010年,几个的年轻人,就在美国成立了一家公司 dotcloud。
做一些pass的云计算服务!LXC(Linux Container容器)有关的容器技术!
Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。
他们将自己的技术(容器化技术)命名就是 Docker
Docker刚刚延生的时候,没有引起行业的注意!dotCloud,就活不下去!
然后他们决定开源
2013年,Docker开源!
越来越多的人发现docker的优点!火了。Docker每个月都会更新一个版本!
2014年4月9日,Docker1.0发布!
docker为什么这么火?十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个VMware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也属于虚拟化技术,Docker容器技术,也是一种虚拟化技术!
1.3 容器vs虚拟机
在容器技术出来之前,用的是虚拟机技术
虚拟机原理示意图
缺点:
- 资源占用多
- 冗余步骤多
- 启动很慢
容器化技术示意图
不是模拟的完整的操作系统
二者对比
比较虚拟机和Docker的不同
传统虚拟机 | Docker | |
---|---|---|
虚拟内容 | 硬件+完整的操作系统+软件 | APP+LIB |
大小 | 笨重,通常几个G | 轻便几个M或KB |
启动速度 | 慢,分钟级 | 快,秒级 |
VMware : linux centos 原生镜像(一个电脑!) 隔离、需要开启多个虚拟机! 几个G 几分钟;
docker: 隔离,镜像(最核心的环境 4m + jdk + mysql)十分的小巧,运行镜像就可以了!小巧! 几个M 秒级启动!
比较Docker和虚拟机技术的不同:
- 传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
- 容器内的应用直接运行在宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
- 每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
1.4 聊聊Docker
Docker基于Go语言开发的!开源项目!
docker官网:https://www.docker.com/
文档:https://docs.docker.com/ Docker的文档是超级详细的!
1.5 DevOps(开发、运维)
应用更快速的交付和部署
传统:一对帮助文档,安装程序。
Docker:打包镜像发布测试一键运行。
更便捷的升级和扩缩容
使用了 Docker之后,我们部署应用就和搭积木一样
项目打包为一个镜像,扩展服务器A!服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。
二、Docker安装
2.1 Docker基本组成
明确几个概念:
镜像(image):
docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的.
启动,停止,删除,基本命令
目前就可以把这个容器理解为就是一个简易的 Linux系统。
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库。(很类似git)
Docker Hub是国外的。
阿里云都有容器服务器(配置镜像加速!)
2.2 环境准备
我们要有一台服务器,并且可以操作它
- Linux命令基础,购买linux阿里云的服务器
- CentOS 7
- 使用Xshell链接远程服务器
2.2.1 安装xshell
下载CentOS7 https://www.jianshu.com/p/a63f47e096e8
下载VMware 360软件管家下载
VMware配置虚拟机 https://blog.csdn.net/babyxue/article/details/80970526
xshell链接服务器 https://blog.csdn.net/zzy1078689276/article/details/77280814
2.2.2 Centos安装
https://docs.docker.com/engine/install/centos/
2.3 安装Docker
环境准备
1.Linux要求内核3.0以上
[root@iz2zeak7sgj6i7hrb2g862z ~] # uname -r
3.10.0-514.26.2.el7.x86_64 # 要求3.0以上
2.CentOS 7
[root@iz2zeak7sgj6i7hrb2g862z ~]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
安装
帮助文档:https://docs.docker.com/engine/install/
卸载与安装
1.卸载旧版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2.需要的安装包
yum install -y yum-utils
3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#上述方法默认是从国外的,不推荐
#推荐使用国内的
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4.更新yum软件包索引
yum makecache fast
5.安装docker相关的 docker-ce 社区版 而ee是企业版
yum install docker-ce docker-ce-cli containerd.io # 这里我们使用社区版即可
要看到Complet再收手!
6.启动docker
systemctl start docker # 代表启动成功
7.使用docker version查看是否按照成功
docker version
Client: Docker Engine - Community
Version: 19.03.11
API version: 1.40
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:13:48 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.11
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 42e35e61f3
Built: Mon Jun 1 09:12:26 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
8.测试
docker run hello-world
9.查看已经下载的镜像(从这里可以查看已有镜像的id)
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest bf756fb1ae65 4 months ago 13.3kB
2.4 卸载docker
#1. 卸载依赖
yum remove docker-ce docker-ce-cli containerd.io
#2. 删除资源
rm -rf /var/lib/docker
# /var/lib/docker 是docker的默认工作路径!
2.5 阿里云镜像加速
支付宝扫码登录,短信验证,确认授权
我有两个问题
-
阿里云镜像加速必须配置嘛?
哎呦我去: 加速快
哎呦我去: 要是翻墙就无所谓了
-
这个阿里云必须要买嘛,买哪个,我看阿里云好多产品
哎呦我去:不需要买
哎呦我去:免费的
哎呦我去:阿里云搜索容器服务
哎呦我去:有一个镜像加速
-
这个地址是哪来的呀
1) 登录阿里云找到容器服务
控制台搜索 容器镜像服务
2) 找到镜像加速器
sudo mkdir -p /etc/docker # 创建一个陌路
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://uyfgafsw.mirror.aliyuncs.com"]
}
EOF # 编写配置文件
sudo systemctl daemon-reload # 重启服务
sudo systemctl restart docker # 重启docker
三、底层原理
3.1 Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socket从客户端访问!
Docker-Server接收到Docker-Client的指令,就会执行这个命令!
3.2 Docker为什么比VM快?
- Docker有着比虚拟机更少的抽象层
- docker主要用的是宿主机的内核,vm需要Guest OS
所以说新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导;
因此,当新建一个 容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。仍而避免引导、加载操作系统内核返个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,返个新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了这个复杂的过程,因此新建一个docker容器只需要几秒钟。
四、Docker常用命令
4.1 帮助命令
docker version # 显示docker的基本信息
docker info # 系统信息,镜像和容器的数量
docker 命令 --help # 全部信息
帮助文档的地址:https://docs.docker.com/engine/reference/commandline/build/
4.2 镜像命令
docker images #查看所有本地主机上的镜像 可以使用docker image ls代替
docker search #搜索镜像
docker pull #下载镜像
docker rmi #删除镜像
1)docker images查看所有本地的主机上的镜像
[root@192 ~]# docker images
# 解释 REPOSITORY # 镜像仓库源 TAG # 镜像的标签 IMAGE ID # 镜像的ID CREATED # 镜像的创建时间 SIZE # 镜像的大小
--all , -a Show all images (default hides intermediate images) # 列出所有jing'x详细信息 --digests Show digests --filter , -f Filter output based on conditions provided --format Pretty-print images using a Go template --no-trunc Don’t truncate output --quiet , -q Only show numeric IDs # #列出所有镜像的id
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -a #列出所有镜像详细信息
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images -aq #列出所有镜像的id
d5f28a0bb0d0
f19c56ce92a8
1b6b1fe7261e
1b6b1fe7261e
2)docker search 搜索镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search mysql
# --filter=STARS=3000 #过滤,搜索出来的镜像收藏STARS数量大于3000的
Options:
-f, --filter filter Filter output based on conditions provided
--format string Pretty-print search using a Go template
--limit int Max number of search results (default 25)
--no-trunc Don't truncate output
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL IS ... 9520 [OK]
mariadb MariaDB IS ... 3456 [OK]
搜索仓库中的镜像,相当于网页搜索
网页搜索
docker search mysql
docker search --help
# 解释 Options: -f, --filter filter Filter output based on conditions provided --format string Pretty-print search using a Go template --limit int Max number of search results (default 25) --no-trunc Don't truncate output
docker search mysql --filter=STARS=3000 # 搜索出Stars大于3000的
3)docker pull 下载镜像
# 下载镜像 docker pull 镜像名[:tag]
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull tomcat:8
8: Pulling from library/tomcat #如果不写tag,默认就是latest
90fe46dd8199: Already exists #分层下载: docker image 的核心 联合文件系统
35a4f1977689: Already exists
bbc37f14aded: Already exists
74e27dc593d4: Already exists
93a01fbfad7f: Already exists
1478df405869: Pull complete
64f0dd11682b: Pull complete
68ff4e050d11: Pull complete
f576086003cf: Pull complete
3b72593ce10e: Pull complete
Digest: sha256:0c6234e7ec9d10ab32c06423ab829b32e3183ba5bf2620ee66de866df # 签名防伪
Status: Downloaded newer image for tomcat:8
docker.io/library/tomcat:8 #真实地址
#等价于
docker pull tomcat:8
docker pull docker.io/library/tomcat:8
# 指定版本下载 docker pull mysql:5.7
版本来自于官网,版本库https://hub.docker.com/_/mysql
docker images #查看所有的镜像
此时查看镜像,可以看到新下载的两个
4)docker rmi 删除镜像
# 删除一个 可以通过名称 也可以指定id -f表示删除所有
docker rmi -f 9cfcce23593a
# 删除多个 用空格分隔id
docker rmi -f id id id
# 删除所有
docker rmi -f $(docker images -aq) # images -aq就是查所有镜像id,从而递归删除
4.3 容器命令
说明:有了镜像才能创建容器,linux,下载一个centos镜像来测试学习
docker pull centos
#docker中下载centos
docker pull centos
docker run 镜像id #新建容器并启动
docker ps 列出所有运行的容器 docker container list
docker rm 容器id #删除指定容器
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker container list #h和docker ps相同
1)新建容器并启动
docker run [可选参数] image # 参数说明 --name=“Name” # 容器名字,用于区分容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p 指定容器的端口 如-p 8080::8080 -p ip:主机端口:容器端口 -p 主机端口:容器端口 -p 容器端口 -p 随机指定端口
docker run [可选参数] image | docker container run [可选参数] image
#参书说明
--name="Name" #容器名字 tomcat01 tomcat02 用来区分容器
-d #后台方式运行
-it #使用交互方式运行,进入容器查看内容
-p #指定容器的端口 -p 8080(宿主机):8080(容器)
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
容器端口
-P(大写) 随机指定端口
# 测试、启动并进入容器
[root@iz2zeak7sgj6i7hrb2g
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -it centos /bin/bash
[root@241b5abce65e /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@241b5abce65e /]# exit #从容器退回主机
2)进入退出容器
# 进入 docker run -it centos /bin/bash
# 查看目录 ls
# 退出 exit
# ctrl +P +Q #容器不停止退出 ---注意:这个很有用的操作
3)查看运行的容器
docker ps 命令 #列出当前正在运行的容器
-a, --all #列出当前正在运行的容器 + 带出历史运行过的容器
-n=?, --last int #列出最近创建的?个容器 ?为1则只列出最近创建的一个容器,为2则列出2个
-q, --quiet #只列出容器的编号
# 查看正在运行的容器
docker ps
# 查看曾经运行的容器
docker ps -a
# 显示最近创建的容器,设置显示个数
docker ps -a - n=?
# 只显示容器的编号
docker ps -aq
[root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@192 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9939864fa2e6 centos "bin/bash" 4 minutes ago Exited (0) 4 minutes ago unruffled_knuth 5f42e9930435 centos "/bin/bash" 8 minutes ago Exited (0) 4 minutes ago lucid_cannon a89ddb393d3d bf756fb1ae65 "/hello" 19 hours ago Exited (0) 19 hours ago gracious_bhabha [root@192 ~]# docker ps -a -n=2 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9939864fa2e6 centos "bin/bash" 6 minutes ago Exited (0) 6 minutes ago unruffled_knuth 5f42e9930435 centos "/bin/bash" 10 minutes ago Exited (0) 7 minutes ago [root@192 ~]# docker ps -aq 9939864fa2e6 5f42e9930435 a89ddb393d3d
4)退出容器
# 容器停止退出 exit # 容器不停止退出 注意必须在英文输入法下,中文输入法不行 Ctrl + P + Q
[root@192 ~]# docker run -it centos /bin/bash [root@bfcea13c40cd /]# [root@192 ~]# docker ps ##注意这里会自动给个命令,删掉 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bfcea13c40cd centos "/bin/bash" About a minute ago Up About a minute stoic_wilson edbd9366d959 centos "/bin/bash" 7 minutes ago Up 7 minutes affectionate_bartik [root@192 ~]# docker exec -it edbd9366d959 /bin/bash ## 再次进入 [root@edbd9366d959 /]# exit ##停止并推出 exit
5)删除容器
# 删除指定容器 不能删除正在运行的容器,如果强制删除 rm -f
docker rm 容器id
# 删除所有容器
docker rm -f $(docker ps -aq)
# 删除所有容器
docker ps -a -q|xargs docker rm
[root@192 ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bfcea13c40cd centos "/bin/bash" 29 minutes ago Up 29 minutes stoic_wilson edbd9366d959 centos "/bin/bash" 35 minutes ago Up 35 minutes affectionate_bartik 9939864fa2e6 centos "bin/bash" 48 minutes ago Exited (0) 48 minutes ago unruffled_knuth 5f42e9930435 centos "/bin/bash" 52 minutes ago Exited (0) 49 minutes ago lucid_cannon a89ddb393d3d bf756fb1ae65 "/hello" 20 hours ago Exited (0) 20 hours ago gracious_bhabha [root@192 ~]# docker rm 5f42e9930435 5f42e9930435 [root@192 ~]# docker rm edbd9366d959 # 注意正在运行的容器不能删除 Error response from daemon: You cannot remove a running container edbd9366d9596c744dd449119269b04de2f2a494e7fc471f6396bcefd94c33fe. Stop the container before attempting removal or force remove
[root@192 ~]# docker ps -aq # 所有容器id bfcea13c40cd edbd9366d959 9939864fa2e6 a89ddb393d3d [root@192 ~]# docker rm -f $(docker ps -aq) # 全部删除 bfcea13c40cd edbd9366d959 9939864fa2e6 a89ddb393d3d
6)启动和停止容器的操作
docker start 容器id #启动容器
docker restart 容器id #重启容器
docker stop 容器id #停止当前正在运行的容器
docker kill 容器id #强制停止当前容器
[root@192 ~]# docker run -it centos /bin/bash [root@7b1a7dd10ea4 /]# exit exit [root@192 ~]# docker ps #查看正在运行的 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@192 ~]# docker ps -a # 查看历史运行过的 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b1a7dd10ea4 centos "/bin/bash" 54 seconds ago Exited (0) 42 seconds ago fervent_mirzakhani [root@192 ~]# docker start 7b1a7dd10ea4 # 启动当前这个容器 container id 粘过 来 7b1a7dd10ea4 [root@192 ~]# docker ps # 查看当前运行容器 发现启动成功 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7b1a7dd10ea4 centos "/bin/bash" 2 minutes ago Up 28 seconds fervent_mirzakhani [root@192 ~]# docker stop 7b1a7dd10ea4 # 停止运行 7b1a7dd10ea4 [root@192 ~]# docker ps # 再次查看 没有这个容器了 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4.4 常用其他命令
1)后台启动命令
# 命令 docker run -d 镜像名
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d centos
a8f922c255859622ac45ce3a535b7a0e8253329be4756ed6e32265d2dd2fac6c
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 问题docker ps. 发现centos 停止了
# 常见的坑,docker容器使用后台运行,就必须要有要一个前台进程,docker发现没有应用,就会自动停止
# nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
2)查看日志
docker logs --help
Options:
--details Show extra details provided to logs
* -f, --follow Follow log output
--since string Show logs since timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
* --tail string Number of lines to show from the end of the logs (default "all")
* -t, --timestamps Show timestamps
--until string Show logs before a timestamp (e.g. 2013-01-02T13:23:37) or relative (e.g. 42m for 42 minutes)
➜ ~ docker run -d centos /bin/sh -c "while true;do echo 6666;sleep 1;done" #模拟日志
#显示日志
-tf #显示日志信息(一直更新)
--tail number #需要显示日志条数
docker logs -t --tail n 容器id #查看n行日志
docker logs -ft 容器id #跟着日志
# 运行一个 [root@192 ~]# docker run -it centos /bin/bash [root@c2887d35c71d /]# [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2887d35c71d centos "/bin/bash" 57 seconds ago Up 56 seconds vigorous_kare # 查看日志,由于没有运行脚本,所以啥也没显示 [root@192 ~]# docker logs -f -t --tail 10 c2887d35c71d ^C # ctrl+c退出 # 运行centos里面加个脚本 [root@192 ~]# docker run -d centos /bin/sh -c "while true;do echo shenzai;sleep 1;done" cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES cb6d7fbc3f27 centos "/bin/sh -c 'while t…" 7 seconds ago Up 6 seconds dreamy_almeida c2887d35c71d centos "/bin/bash" 3 minutes ago Up 3 minutes vigorous_kare # 查看日志 发现隔一秒打印一条 [root@192 ~]# docker logs -f -t --tail 10 cb6d7fbc3f27 2020-06-17T12:02:11.293765084Z shenzai 2020-06-17T12:02:12.297675608Z shenzai 2020-06-17T12:02:13.301845582Z shenzai 2020-06-17T12:02:14.304800996Z shenzai 2020-06-17T12:02:15.307130238Z shenzai 2020-06-17T12:02:16.310574235Z shenzai 2020-06-17T12:02:17.312946923Z shenzai 2020-06-17T12:02:18.314841295Z shenzai 2020-06-17T12:02:19.317021705Z shenzai 2020-06-17T12:02:20.319670013Z shenzai 2020-06-17T12:02:21.322651649Z shenzai 2020-06-17T12:02:22.325466918Z shenzai 2020-06-17T12:02:23.327984704Z shenzai 2020-06-17T12:02:24.329656919Z shenzai
3)查看正在运行的容器信息【查看镜像的元数据】
[root@192 ~]# docker inspect cb6d7fbc3f27 [ { # 容器的完整id "Id": "cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388", # 创建时间 "Created": "2020-06-17T12:00:50.706906186Z", # 脚本位置 "Path": "/bin/sh", # 运行的脚本 "Args": [ "-c", "while true;do echo shenzai;sleep 1;done" ], "State": { "Status": "running", # 状态,正在运行 "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 1909, # 父进程id "ExitCode": 0, "Error": "", "StartedAt": "2020-06-17T12:00:51.093617477Z", "FinishedAt": "0001-01-01T00:00:00Z" }, # 来源镜像 "Image": "sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f", "ResolvConfPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/resolv.conf", "HostnamePath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hostname", "HostsPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/hosts", "LogPath": "/var/lib/docker/containers/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388/cb6d7fbc3f27a064137d58282de97b97365dea2705211ebfbad642079cc1b388-json.log", "Name": "/dreamy_almeida", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, # 主机配置 "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Capabilities": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "private", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DeviceRequests": null, "KernelMemory": 0, "KernelMemoryTCP": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": null, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, # 其他配置 "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907-init/diff:/var/lib/docker/overlay2/7f79322e0f58d651a84a555dadd83d92537788172525945d3f538dd95dce336c/diff", "MergedDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/merged", "UpperDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/diff", "WorkDir": "/var/lib/docker/overlay2/3675586ebbd79cd72d2562a90c9380627a331c563724c0dac091f92600af4907/work" }, "Name": "overlay2" }, "Mounts": [], # 挂载 # 基本配置 "Config": { "Hostname": "cb6d7fbc3f27", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], # 基本环境变量,这里没有Java # 基本命令 "Cmd": [ "/bin/sh", "-c", "while true;do echo shenzai;sleep 1;done" ], "Image": "centos", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": { "org.label-schema.build-date": "20200611", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } }, # 网卡,比如现在用的是桥接的网卡 "NetworkSettings": { "Bridge": "", "SandboxID": "4d701985d7e77aa153790b697b2f38a61e20555c224b7675e4bf650b82799882", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": {}, "SandboxKey": "/var/run/docker/netns/4d701985d7e7", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:03", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "22b0fd2290ccbc4e066a75d3f01bd8bf32ee4352c5bbcfc9f911287219219571", "EndpointID": "8a6c71e2bafb19ca7dfd85445ccc4bef6d17467360a243d624089e676a24a018", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.3", "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:03", "DriverOpts": null } } } } ]
# 停止正在疯狂输出的那个容器 [root@192 ~]# docker stop cb6d7fbc3f27 cb6d7fbc3f27
4)查看容器中进程信息
# 命令 docker top 容器id
5)进入当前正在运行的容器
方式1:docker exec -it 容器id /bin/bash
方式2:docker attach 容器id
# 我们通常容器都是使用后台方式运行的e docker exec -it 容器id bashSHELL # 测试 [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c2887d35c71d centos "/bin/bash" 35 minutes ago Up 35 minutes vigorous_kare [root@192 ~]# docker exec -it c2887d35c71d /bin/bash [root@c2887d35c71d /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr [root@c2887d35c71d /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 11:57 pts/0 00:00:00 /bin/bash root 14 0 0 12:32 pts/1 00:00:00 /bin/bash root 28 14 0 12:32 pts/1 00:00:00 ps -ef [root@c2887d35c71d /]# c2887d35c71d [root@c2887d35c71d /]# exit exit # 方式二 [root@192 ~]# docker attach c2887d35c71d [root@c2887d35c71d /]# # 区别 # docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用) # docker attach 进入容器正在执行的终端,不会启动新的进程
6)从容器内拷贝文件到主机上
docker cp 容器id:容器文件夹目录下的文件 拷贝到主机目录下
# 运行 [root@192 ~]# docker run -it centos # ctrl P Q 不关闭退出,查看 [root@0569081aa89c /]# [root@192 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0569081aa89c centos "/bin/bash" 19 seconds ago Up 19 seconds hopeful_chebyshev # 查看主机home下无文件 [root@192 ~]# cd /home [root@192 home]# ls # 进入正在运行的容器 [root@192 home]# docker attach 0569081aa89c # 进入容器home目录 [root@0569081aa89c /]# cd /home # 在目录中创建java文件 [root@0569081aa89c home]# touch test.java # 退出并停止容器 [root@0569081aa89c home]# exit exit # 查看现在运行的容器 [root@192 home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # 容器虽然被停止,但是数据都会保留 [root@192 home]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0569081aa89c centos "/bin/bash" 3 minutes ago Exited (0) 8 seconds ago hopeful_chebyshev f589e5684a01 centos "/bin/bash" 44 minutes ago Exited (0) 44 minutes ago cranky_easley cb6d7fbc3f27 centos "/bin/sh -c 'while t…" 54 minutes ago Exited (137) 42 minutes ago dreamy_almeida c2887d35c71d centos "/bin/bash" 58 minutes ago Exited (127) 16 minutes ago vigorous_kare 8ce188e5fee3 centos "/bin/bash" About an hour ago Exited (0) About an hour ago tender_dirac 7b1a7dd10ea4 centos "/bin/bash" 9 hours ago Exited (0) 9 hours ago fervent_mirzakhani # 容器数据拷贝到主机 [root@192 home]# docker cp 0569081aa89c:/home/test.java /home [root@192 home]# ls test.java # 拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现自动同步 /home /home
7)查看内容占用
docker stats
8)小结
命令大全
[root@192 home]# docker --help Usage: docker [OPTIONS] COMMAND A self-sufficient runtime for containers Options: --config string Location of client config files (default "/root/.docker") -c, --context string Name of the context to use to connect to the daemon (overrides DOCKER_HOST env var and default context set with "docker context use") -D, --debug Enable debug mode -H, --host list Daemon socket(s) to connect to -l, --log-level string Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info") --tls Use TLS; implied by --tlsverify --tlscacert string Trust certs signed only by this CA (default "/root/.docker/ca.pem") --tlscert string Path to TLS certificate file (default "/root/.docker/cert.pem") --tlskey string Path to TLS key file (default "/root/.docker/key.pem") --tlsverify Use TLS and verify the remote -v, --version Print version information and quit Management Commands: builder Manage builds config Manage Docker configs container Manage containers context Manage contexts engine Manage the docker engine image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes Commands: attach Attach local standard input, output, and error streams to a running container build Build an image from a Dockerfile commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem events Get real time events from the server exec Run a command in a running container export Export a container's filesystem as a tar archive history Show the history of an image images List images import Import the contents from a tarball to create a filesystem image info Display system-wide information inspect Return low-level information on Docker objects kill Kill one or more running containers load Load an image from a tar archive or STDIN login Log in to a Docker registry logout Log out from a Docker registry logs Fetch the logs of a container pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container ps List containers pull Pull an image or a repository from a registry push Push an image or a repository to a registry rename Rename a container restart Restart one or more containers rm Remove one or more containers rmi Remove one or more images run Run a command in a new container save Save one or more images to a tar archive (streamed to STDOUT by default) search Search the Docker Hub for images start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers version Show the Docker version information wait Block until one or more containers stop, then print their exit codes
attach Attach local standard input, output, and error streams to a running container
#当前shell下 attach连接指定运行的镜像
build Build an image from a Dockerfile # 通过Dockerfile定制镜像
commit Create a new image from a container's changes #提交当前容器为新的镜像
cp Copy files/folders between a container and the local filesystem #拷贝文件
create Create a new container #创建一个新的容器
diff Inspect changes to files or directories on a container's filesystem #查看docker容器的变化
events Get real time events from the server # 从服务获取容器实时时间
exec Run a command in a running container # 在运行中的容器上运行命令
export Export a container's filesystem as a tar archive #导出容器文件系统作为一个tar归档文件[对应import]
history Show the history of an image # 展示一个镜像形成历史
images List images #列出系统当前的镜像
import Import the contents from a tarball to create a filesystem image #从tar包中导入内容创建一个文件系统镜像
info Display system-wide information # 显示全系统信息
inspect Return low-level information on Docker objects #查看容器详细信息
kill Kill one or more running containers # kill指定docker容器
load Load an image from a tar archive or STDIN #从一个tar包或标准输入中加载一个镜像[对应save]
login Log in to a Docker registry #
logout Log out from a Docker registry
logs Fetch the logs of a container
pause Pause all processes within one or more containers
port List port mappings or a specific mapping for the container
ps List containers
pull Pull an image or a repository from a registry
push Push an image or a repository to a registry
rename Rename a container
restart Restart one or more containers
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save one or more images to a tar archive (streamed to STDOUT by default)
search Search the Docker Hub for images
start Start one or more stopped containers
stats Display a live stream of container(s) resource usage statistics
stop Stop one or more running containers
tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
top Display the running processes of a container
unpause Unpause all processes within one or more containers
update Update configuration of one or more containers
version Show the Docker version information
wait Block until one or more containers stop, then print their exit codes
五、作业练习
5.1 Docker 安装Nginx
#1. 搜索镜像 search 建议大家去docker搜索,可以看到帮助文档
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker search nginx
#2. 拉取下载镜像 pull
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker pull nginx
#3. 查看是否下载成功镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker images
#3. 运行测试
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker run -d --name nginx01 -p 3344:80 nginx
aa664b0c8ed98f532453ce1c599be823bcc1f3c9209e5078615af416ccb454c2
#4. 查看正在启动的镜像
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
75943663c116 nginx "nginx -g 'daemon of…" 41 seconds ago Up 40 seconds 0.0.0.0:82->80/tcp nginx00
#5. 进入容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker exec -it nginx01 /bin/bash #进入
root@aa664b0c8ed9:/# whereis nginx #找到nginx位置
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@aa664b0c8ed9:/# cd /etc/nginx/
root@aa664b0c8ed9:/etc/nginx# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
#6. 退出容器
root@aa664b0c8ed9:/etc/nginx# exit
exit
#7. 停止容器
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aa664b0c8ed9 nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:3344->80/tcp nginx01
[root@iz2zeak7sgj6i7hrb2g862z ~]# docker stop aa664b0c8ed9
# 官网搜索nginx,可以看到帮助文档 # 下载镜像 [root@192 home]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 8559a31e96f4: Pull complete 8d69e59170f7: Pull complete 3f9f1ec1d262: Pull complete d1f5ff4f210d: Pull complete 1e22bfa8652e: Pull complete Digest: sha256:21f32f6c08406306d822a0e6e8b7dc81f53f336570e852e25fbe1e3e3d0d0133 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest # 查看镜像 [root@192 home]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 831691599b88 13 hours ago 215MB nginx latest 2622e6cca7eb 7 days ago 132MB # 运行测试 # -d 后台运行,--name 命名,-p 暴露端口,3344服务器、宿主机的端口,容器内部端口 [root@192 home]# docker run -d --name nginx01 -p:3344:80 nginx 38dbf7bdcaef232d269b7184d91e44e06087181b5ee929494e177ad526810fa8 [root@192 home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38dbf7bdcaef nginx "/docker-entrypoint.…" 7 seconds ago Up 6 seconds 0.0.0.0:3344->80/tcp nginx01 # 使用3344可以访问成功 [root@192 home]# curl localhost:3344Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
宿主机端口 和 容器内部端口 以及端口暴露:
思考问题:每次改动nginx配置文件,都需要进入容器内部,十分麻烦,要是可以在容器外部提供一个映射路径,达到在容器修改文件名,容器内部就可以自动修改?-v 数据卷技术
5.2 docker 安装tomcat
# 下载 tomcat9.0
# 之前的启动都是后台,停止了容器,容器还是可以查到, docker run -it --rm 镜像名 一般是用来测试,用完就删