- Docker概述
- Docker安装
- Docker命令
- Docker镜像
- 容器数据卷
- DokcerFile
- Docker网络原理
- IDEA整合Docker
- Docker Compose
- Docker Swarm
- CI\CD jenkins
Docker概述
为什么出现?环境配置麻烦。
在容器技术之前,使用虚拟机技术。
vm:linux centos原生镜像(一个电脑)隔离,需要开启多个虚拟机
docker:隔离,镜像(最核心的环境4m+jdk+mysql)十分小巧,运行镜像即可
Docker基于Go语言开发
官网:https://www.docker.com/
文档:https://docs.docker.com/
仓库:https://hub.docker.com/
虚拟技术缺点
- 资源占用多
- 冗余步骤多
- 启动慢
容器化技术
并非模拟完整的操作系统
比较:
- 传统虚拟机,虚拟硬件,运行完整的操作系统,然后安装运行软件
- 容器的应用直接运行在宿主机的内核,没有虚拟硬件,轻便
- 每个容器之间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响
DevOps(开发、运维)
快速交付部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
快捷升级扩容
更简单系统运维
容器化后,开发、测试环境高度一致
更高效的计算资源利用
Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例,将性能压缩到极致。
Docker安装
基本组成
镜像(image):
好比一个模板,用来创建容器服务,通过镜像可以创建多个容器(最终服务/项目运行在容器中)。
容器(container):
容器技术独立运行一个/一组应用,通过镜像创建。
启动,停止,删除,基本命令!
仓库(repository):
仓库是存放镜像的地方。
分为公有仓库和私有仓库,类似maven
安装
环境检查
ihan@ubuntu:~/Desktop$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.2 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.2 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
本人在Ubuntu20.04环境下的docker安装步骤:
更新软件包索引
sudo apt update sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
导入源仓库的 GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
将 Docker APT 软件源添加到系统
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
安装最新版docker
sudo apt update sudo apt install docker-ce docker-ce-cli containerd.io
验证
sudo systemctl status docker
以非 Root 用户身份执行 Docker
sudo usermod -aG docker $USER
运行hello world
docker container run hello-world
查看镜像
sudoo docker images
卸载docker ```shell docker container stop $(docker container ls -aq) docker system prune -a —volumes
sudo apt purge docker-ce sudo apt autoremove
<a name="CbhEi"></a>
## 底层原理
**Docker如何工作?**<br />Docker是CS结构的系统,Docker守护进程运行在主机上,通过Socket从客户端访问。
**效率**<br />新建一个容器,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。虚拟机加载Guest OS,分钟级别,而docker利用宿主机的操作系统,省略复杂过程,秒级。
<a name="FTG8i"></a>
## Docker常用命令
<a name="XjIfE"></a>
#### 帮助命令
```shell
docker version # 显示docker版本信息
docker info # 显示docker系统信息,包括镜像和容器的数量
docker --help # 帮助命令
帮助文档地址:https://docs.docker.com/engine/reference/commandline/cli/
镜像命令
docker images # 查看主机镜像
# 可选项
-a # 列出所有镜像
-q # 只显示镜像id
docker search mysql # 搜索镜像
-- 可选项,通过收藏过滤
--filter=STARTS=3000
docker pull mysql # 下载镜像 [:tag]
docker rmi -f idxxx
# 可根据id、名字删除,空格删除多个镜像
docker rmi -f $(docker images -aq) # 全部删除
容器命令
下载一个centos学习
docker pull centos
新建容器并启动
docker run [可选参数] image
# 参数说明
--name ="Name" 容器名字
-d 后台方式运行
-it 使用交互方式运行
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口(常用)
-p 容器端口
# 测试
C:\Users\iHan>docker run -it centos /bin/bash
[root@2713824e1dfa /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@2713824e1dfa /]# exit
exit
列出所有运行的容器
docker ps # 列出当前运行的容器
-a # 列出当前运行+历史运行过容器
-n=? # 最近创建的容器
-q # 只显示容器编号
C:\Users\iHan>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2713824e1dfa centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago nice_ardinghelli
13f1d9be2776 mysql:5.7 "docker-entrypoint.s…" 22 hours ago Up 22 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-test
C:\Users\iHan>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
13f1d9be2776 mysql:5.7 "docker-entrypoint.s…" 22 hours ago Up 22 hours 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp mysql-test
退出容器
exit # 退出容器并停止
ctrl+p+q # 退出容器但不停止
删除容器
docker rm 容器id # 删除指定容器,不能删除正在运行的
docker rm -f $(docker ps -aq) # 强制删除所有容器
docker ps -a -q|xargs docker rm # 删除所有容器
启动和停止容器
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器id # 强制停止
常用其他命令
# 常见的坑,docker容器使用后台运行,必须有一个前台进程,dockr发现没有应用,会自动停止
docker run -d centos
日志命令
C:\Users\iHan>docker logs --help
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
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:37Z) or relative (e.g. 42m for 42
minutes)
-n, --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:37Z) or relative (e.g. 42m for 42
minutes)
docker logs -tf --tail id 容器没有日志
# 自己编写一段脚本
C:\Users\iHan>docker run -d centos /bin/sh -c "while true;do echo ihan;sleep 1;done"
4666c2b1c6656a5ec8c8d67cfb98ba98a83de798b61414315ee6470edc2d5667
C:\Users\iHan>docker ps
CONTAINER ID IMAGE
4666c2b1c665 centos
# 显示日志
-tf # 显示日志
--tail number # 显示日志条数
C:\Users\iHan>docker logs -tf --tail 10 4666c2b1c665
2021-06-28T00:52:29.988294500Z ihan
2021-06-28T00:52:30.988896200Z ihan
2021-06-28T00:52:31.991083000Z ihan
2021-06-28T00:52:32.992641200Z ihan
2021-06-28T00:52:33.994023100Z ihan
2021-06-28T00:52:34.995868800Z ihan
2021-06-28T00:52:35.997390000Z ihan
2021-06-28T00:52:36.998599200Z ihan
2021-06-28T00:52:37.999835400Z ihan
2021-06-28T00:52:39.001415900Z ihan
2021-06-28T00:52:40.002791200Z ihan
2021-06-28T00:52:41.004353000Z ihan
2021-06-28T00:52:42.006254000Z ihan
2021-06-28T00:52:43.008686800Z ihan
查看容器进程
# docker top id
C:\Users\iHan>docker top 4666c2b1c665
UID PID PPID C STIME
root 1298 1277 0 00:51
root 1576 1298 0 00:54
元数据
C:\Users\iHan>docker inspect --help
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
进入当前正在运行的容器
# 通常使用后台的方式运行,需要进入容器,修改一些配置
# 命令
方式一:docker exec -it 容器id bashshell
C:\Users\iHan>docker exec -it 4666c2b1c665 /bin/bash
[root@4666c2b1c665 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@4666c2b1c665 /]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 00:51 ? 00:00:00 /bin/sh -c while true;do echo ihan;sleep 1;done
root 612 0 0 01:01 pts/0 00:00:00 /bin/bash
root 655 1 0 01:01 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep
root 656 612 0 01:01 pts/0 00:00:00 ps -ef
方式二:docker attach 容器id
C:\Users\iHan>docker attach 4666c2b1c665
ihan
ihan
ihan
区别:
docker exec # 进入容器后开启一个新的终端,可以在里面操作(常用)
docker attach # 进入当前容器,不会启动新的进程
从容器拷贝文件到主机上
docker cp 容器id
docker cp 4666c2b1c665 /home/test.java /home
# 拷贝是一个手动过程,未来我们使用-v卷技术,可以实现自动同步