Docker学习(一)

文档:https://docs.docker.com/

Hub : https://hub.docker.com/

路线

  • Docker概述
  • Docker安装
  • Docker命令
    • 镜像命令
    • 容器命令
    • 操作命令
    • ……
  • Docker镜像
  • 容器数据卷
  • DockerFile
  • Docker网络原理
  • Docker Compose
  • Docker Swarm
  • CI\CD Jenkins

Docker概述

Docker为什么会出现?

环境配置十分麻烦,每个机器都要部署环境,很难跨平台,集群环境更浪费时间。项目能不能带上环境打包(镜像)。

能干嘛?

之前的虚拟机技术,浪费资源比较多

缺点:

  • 资源占用多
  • 冗余步骤多
  • 启动很慢

容器化技术

不是模拟一个完整的操作系统

不同之处:

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

DevOps(开发 运维)

更快速的交付和部署

传统:一堆帮助文档,安装程序

Docker: 打包镜像发布测试,一键运行

更便捷的升级和扩容缩容,更高效的计算资源利用,测试环境都高度一致。

Docker是内核级别的虚拟化,可以再一个物理机上运行很多的容器实例。

Docker 基本组成

从左到右,依次是客户端、服务器和仓库。

  • 镜像(Image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务。如:tomcat镜像—->run—->tomcat01容器。通过这个镜像可以创建多个容器,最终服务运行或者项目运行就是在容器中的

  • 容器(Containers):Docker利用容器技术,可以独立运行一个或者一组应用,通过镜像来创建。启动,

    停止,删除基本命令。目前可把这个容器简单理解为就是一个简易的linux系统。

  • 仓库(Repository):存放镜像的地方。分为公有仓库和私有仓库,和GitHub差不多。Docker hub默认是国外的,可以配阿里云镜像加速。

Hello World

如何查看hello world镜像

1
2
3
4
(base) root@localhost:/home/cpss# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
studyfang/hgn latest 37553493935b 10 months ago 8.88GB

docker默认工作路径

1
2
(base) root@localhost:/home/cpss# ls /var/lib/docker/
buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes

镜像加速

创建或修改 /etc/docker/daemon.json 文件,修改为如下形式

1
2
3
4
5
6
7
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
1
2
3
4
(base) root@localhost:/etc/docker# vim daemon.json
(base) root@localhost:/etc/docker# systemctl daemon-reload
(base) root@localhost:/etc/docker# systemctl restart docker
(base) root@localhost:/etc/docker# systemctl status docker

使用docker info 查看镜像改变。

run流程原理

docker是怎么工作的?

docker是一个client-server结构的系统,docker的守护进程运行在主机上,通过socket从客户端访问。

docker server 接收到docker client的指令就会执行这个命令

docker为什么比VM快?

docker有比虚拟机更少的抽象层。

docker利用的是宿主机的内核,vm需要Guest OS

所以新建一个容器的时候,docker不需要向虚拟机一样重新加载一个操作系统内核。避免引导操作,虚拟机是加载GuestOS,docker是利用宿主机的操作系统,省略了这个复杂的过程。

Docker的常用命令

1
2
3
docker version     # docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help # 帮助命令

镜像命令

docker images

1
2
3
4
(base) root@localhost:/home/cpss# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 4 months ago 13.3kB
studyfang/hgn latest 37553493935b 10 months ago 8.88GB
  • REPOSITORY 镜像的仓库源

  • TAG 镜像的标签

  • IMAGE ID 镜像的id

  • CREATED 镜像的创建时间

  • SIZE 镜像大小

    1
    2
    3
    Options:
    -a, --all Show all images (default hides intermediate images)
    -q, --quiet Only show image IDs

    docker search 搜索镜像

1
2
3
4
5
6
7
8
9
(base) root@localhost:/home/cpss# docker search hotpotqa
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
qipeng/hotpotqa-eval 0
studyfang/hotpotqa 0
qipeng/hotpotqa-base 0
tuming1990/hotpotqa-docker 0
hamishivi/hotpotqa-base Hotpotqa with extra packages. 0
qipeng/hotpotqa_submission_cuda10.2 0
tswings2018/hotpotqa by deng 0

docker pull

1
# 下载镜像 docker pull 镜像名[:tag]

docker rmi 删除镜像

可通过id 或者 名称来删

1
docker rmi -f 镜像id

容器命令

有了镜像才可以创建容器

这里下载一个centos镜像来测试学习

1
docker pull centos

新建容器并启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker run [可选参数] image
# 参数说明
--name="Name" 容器名字 tomcat01 tomcat02 用来区分容器
-d 后台方式运行 nohup
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 ip:主机端口:容器端口 主机端口:容器端口(常用) 容器端口
-P 随机指定端口
# 测试 启动并进入容器
(base) root@linux:/home/cpss# docker run -it centos /bin/bash
[root@ef41db25d696 /]# 容器内就是自己的服务器环境

docker ps # 查看正在运行的容器
docker ps -a # 查看曾经运行过的容器
docker ps -a -n=1 # 显示个数
docker ps -aq # 只显示编号

退出容器

1
2
exit # 直接退出容器并停止
ctrl +p +q # 容器不停止退出

删除容器

删除容器

1
2
3
4
docker rm 容器id                # 删除指定的容器 不能删除正在运行的容器 -f强制删除
docker rm -f $(docker ps -aq) # 删除所有的容器

docker ps -a -q|xargs docker rm # 删除所有的容器

启动和停止容器的操作

1
2
3
4
docker start 容器id
docker restart 容器id
docker stop 容器id
docker kill 容器

常用其他命令

后台启动容器

1
2
3
4
docker run -d centos
# 问题 docker ps时发现centos停止了
# 常见的坑,docker 容器使用后台运行,就必须要有一个前台进程。docker发现没有应用就会自动停止。
# 容器启动后,发现自己没有提供服务,就会立即停止

查看日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(base) root@linux:/home/cpss# 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: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)


# -tf 显示日志
# --tail number 要显示日志条数
docker logs -tf --tail 10 f3c59b35b738
# 容器没有日志
# 自己写一段shell
(base) root@linux:/home/cpss# docker run -d centos /bin/sh -c "while true;do echo 111;sleep 1;done"
ba0ae87cb0949d44e179f03e2bb3e25a38b394bb98b7aa0f4a1a2b9ad68ca86d
(base) root@linux:/home/cpss# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba0ae87cb094 centos "/bin/sh -c 'while t…" 3 seconds ago Up 1 second determined_bouman
(base) root@linux:/home/cpss# docker logs -tf --tail 10 ba0ae87cb094

查看容器中的进程信息

1
docker top 容器id

查看镜像的元数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
docker inspect 容器id

(base) root@linux:/home/cpss# docker inspect ba0ae87cb094
[
{
"Id": "ba0ae87cb0949d44e179f03e2bb3e25a38b394bb98b7aa0f4a1a2b9ad68ca86d",
"Created": "2021-08-01T03:10:14.298411164Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo 111;sleep 1;done"
],
"State": {
"Status": "exited",
"Running": false,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 0,
"ExitCode": 137,
"Error": "",
"StartedAt": "2021-08-01T03:10:15.270494437Z",
"FinishedAt": "2021-08-01T03:12:01.287526932Z"
},
"Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
.....
]

进入当前正在运行的容器

1
2
3
4
5
6
7
8
# 我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
# 方式1
docker exec -it 容器id bashShell
# 方式2
docker attach 容器id
# 区别
# attach 正在执行的代码 进入正在执行的终端,不会启动新的进程
# exec 进入容器后开启一个新的终端,可以在里面操作

从容器内拷贝文件到主机上

1
2
3
# 容器停止也可以拷贝,容器在数据就在
docker cp 容器id:容器内路径 目的的主机路径
# 拷贝是一个手动过程,以后可以使用 -v 卷的技术 可以实现自动同步

命令小结

现在学的是Images 和 Cotainer里的命令,其他的还没学