• Docker概述
  • Docker安装
  • Docker命令
  • Docker镜像
  • 容器数据卷
  • DokcerFile
  • Docker网络原理
  • IDEA整合Docker
  • Docker Compose
  • Docker Swarm
  • CI\CD jenkins

Docker概述

为什么出现?环境配置麻烦。
在容器技术之前,使用虚拟机技术。

  1. vmlinux centos原生镜像(一个电脑)隔离,需要开启多个虚拟机
  2. docker:隔离,镜像(最核心的环境4m+jdk+mysql)十分小巧,运行镜像即可

Docker基于Go语言开发
官网:https://www.docker.com/
文档:https://docs.docker.com/
仓库:https://hub.docker.com/

虚拟技术缺点

  1. 资源占用多
  2. 冗余步骤多
  3. 启动慢

容器化技术
并非模拟完整的操作系统

比较:

  • 传统虚拟机,虚拟硬件,运行完整的操作系统,然后安装运行软件
  • 容器的应用直接运行在宿主机的内核,没有虚拟硬件,轻便
  • 每个容器之间互相隔离,每个容器内都有一个属于自己的文件系统,互不影响

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安装步骤:

  1. 更新软件包索引

    sudo apt update
    sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
    
  2. 导入源仓库的 GPG key

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
  3. 将 Docker APT 软件源添加到系统

    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    
  4. 安装最新版docker

    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io
    
  5. 验证

    sudo systemctl status docker
    

    image.png

  6. 以非 Root 用户身份执行 Docker

    sudo usermod -aG docker $USER
    
  7. 运行hello world

    docker container run hello-world
    

    image.png

  8. 查看镜像

    sudoo docker images
    

    image.png

  9. 卸载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卷技术,可以实现自动同步

常用命令小结

image.png