Docker基础用法
Docker介绍
什么是Docker
Docker是容器技术的一个前端工具,容器是内核的一项技术,Docker只是把这一项技术的使用得以简化,使之普及而已
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker是通过内核虚拟化技术(namespaces(命令空间)及cgroups(控制组)等)来提供容器的资源隔离与安全保障等,由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要虚拟机(VM)额外的操作系统开销,提高资源利用率。
OCI&OCF
OCI
开源容器方案
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
- 包含两个规格
- 运行时规范
- 图像规格
OCF
开源容器格式
runC是一个CLI工具,用于根据OCI规范生成和运行容器
- 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护程序
- runC 建立在 libcontainer 之上,libcontainer 是支持数百万个 Docker 引擎安装的相同容器技术
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
Docker镜像与镜像仓库的关系
- 镜像仓库:是存放镜像的场所,dockerhub是最大的开源仓库,可以通过docker search 查找所需镜像并通过docker pull拉取
- 镜像:docker 真正的操作对象
- 容器:docker run 启动镜像会变成容器,容器顶层为一个可操作层,修改不会影响镜像。每个镜像可以启动生成多个容器。
- 镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
下图中
圆饼为镜像文件
,可以有很多的版本长方形为镜像仓库
Docker对象
使用docker时,您正在创建和使用镜像、容器、网络、卷、插件和其他对象。
- 镜像
- 镜像是一个只读模板,其中包含创建docker容器的说明。
- 通常,一个镜像基于另一个镜像,并进行了一些额外的定制。
- 您可以创建自己的镜像,也可以只使用其他人创建并在注册表中发布的镜像。
- 容器
- 容器是镜像的可运行实例。
- 您可以使用docker API或CLI创建、运行、停止、移动或删除容器。
- 您可以将容器连接到一个或多个网络,将存储连接到容器,甚至可以基于其当前状态创建新镜像。
Docker工作原理
当您请求 Docker 运行容器时,Docker 会在您的计算机上设置一个资源隔离的环境。然后 Docker 会将打包的应用程序和关联的文件复制到 Namespace 内的文件系统中,此时环境的配置就完成了。之后 Docker 会执行您指定的命令运行应用程序。
Docker 在运行时分为 Docker 引擎(服务端守护进程) 和 客户端工具,我们日常使用各种 docker 命令,其实就是在使用 客户端工具 与 Docker 引擎 进行交互。
Docker部署
Docker安装
mirrors.tuna.tsinghua.edu.cn
mirrors.aliyun.com
mirrors.163.com
download.docker.com
//配置docker源仓库
sudo curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
//安装
sudo yum -y install docker-ce
//启动
sudo systemctl start docker
//docker 加速
sudo tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors": ["https://j3m2itm3.mirror.aliyuncs.com"]
}
EOF
sudo systemctl restart docker
Docker中国区官方镜像
https://registry.docker-cn.com
网易
http://hub-mirror.c.163.com
ustc
https://docker.mirrors.ustc.edu.cn
[root@localhost docker]# docker version
Client: Docker Engine - Community
Version: 20.10.11
API version: 1.41
Go version: go1.16.9
Git commit: dea9396
Built: Thu Nov 18 00:38:53 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.11
API version: 1.41 (minimum version 1.12)
Go version: go1.16.9
Git commit: 847da18
Built: Thu Nov 18 00:37:17 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.12
GitCommit: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc:
Version: 1.0.2
GitCommit: v1.0.2-0-g52b36a2
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@localhost docker]# docker info
Client:
Context: default
Debug Mode: false
Plugins:
app: Docker App (Docker Inc., v0.9.1-beta3)
buildx: Build with BuildKit (Docker Inc., v0.6.3-docker)
scan: Docker Scan (Docker Inc., v0.9.0)
Server:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 20.10.11
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Cgroup Version: 1
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: inactive
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-862.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.685GiB
Name: localhost.localdomain
ID: SOWL:K5KU:KZXR:ZXI2:ZGSP:V3QL:BLKS:5LEK:EAB4:UXTH:4LWQ:XECU
Docker Root Dir: /var/lib/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://j3m2itm3.mirror.aliyuncs.com/
Live Restore Enabled: false
Docker 事件状态
Docker常用操作
命令 | 功能 |
---|---|
docker search | 在Docker 中心搜索镜像 |
docker pull | 从注册表中拉取镜像或存储库 |
docker images | 镜像列表 |
docker create | 创建一个新的容器 |
docker start | 启动一个或多个停止的容器 |
docker run | 在新容器中运行命令 |
docker ps | 列表容器 |
docker logs | 获取容器的日志 |
docker restart | 重启一个容器 |
docker stop | 停止一个或多个正在运行的容器 |
docker kill | 杀死一个或多个正在运行的容器 |
docker rm | 移除一个或多个容器 |
docker exec | 在正在运行的容器中运行命令 |
docker info | 显示整个系统的信息 |
docker attach | 连接到正在运行的容器(进入容器;前台运行,退出则容器停止) |
docker inspect | 返回Docker对象的详细信息(进入容器;退出容器不会停止) |
案例
docker search
搜索镜像
[root@localhost ~]# docker search kali
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
kalilinux/kali-rolling Official Kali Linux Docker image (weekly sna… 358
kalilinux/kali Image built from the last snapshot of the of… 98
linuxkonsult/kali-metasploit Kali base image with metasploit 71 [OK]
kalilinux/kali-bleeding-edge Same as kali-rolling with kali-bleeding-edge… 35
booyaabes/kali-linux-full Kali image with kali-linux-full metapackage … 31 [OK]
jasonchaffee/kali-linux Kali Linux Docker Container with the kali-li… 21 [OK]
lukaszlach/kali-desktop Kali Linux desktop running in Docker on any … 18 [OK]
donaldrich/kali-linux Multi-arch Kali-rolling base image with kali… 16
brimstone/kali Image for various bits of Kali Linux 11 [OK]
toolisticon/kalilinux Kali Linux (full package) 8 [OK]
kalinon/comicstreamer ComicStreamer is a media server app for shar… 4 [OK]
isaudits/kali Kali Linux with installed toolset; separate … 3
kalilinux/kali-experimental Image built from the kali-dev + kali-experim… 2
kalilinux/kali-dev Image built from the kali-dev development re… 2
thomasleplus/kali Kali Linux as a docker container. 2
kalisio/kano Kano Application 1
blairy/kali_patched Fully patched Kali Docker Image. 0
artis3n/kali Source + Readme: https://github.com/artis3n/… 0
haraldaarz/kali_xfce_top10 Kali with xfce, and kali-tools-top10. Used i… 0
kalisio/kapp Kalisio application template 0
pant/kali Clean Kali Installation-Update from official… 0
kaliti/kaliti This container is used to run bitbucket pipe… 0
kalisio/aktnmap Akt'n'Map application 0
chiphwang/kali_metasploit_msfconsole 0
pidof/kalister kali linux ... updating to my personal env a… 0
docker pull
从Registry仓库中下载镜像
[root@localhost ~]# docker pull httpd
Using default tag: latest
latest: Pulling from library/nginx
eff15d958d66: Pull complete
1e5351450a59: Pull complete
2df63e6ce2be: Pull complete
9171c7ae368c: Pull complete
020f975acd28: Pull complete
266f639b35ad: Pull complete
Digest: sha256:097c3a0913d7e3a5b01b6c685a60c03632fc7a2b50bc8e35bcaa3691d788226e
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
docker images
显示镜像列表
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
httpd latest ad17c88403e2 12 days ago 143MB
docker create
创建容器
[root@localhost ~]# docker create nginx
599606d03bf31b19ac13e3507f94949e26fcf3531b683acd2345b188e4679478
[root@localhost ~]# docker create httpd
Unable to find image 'httpd:latest' locally
latest: Pulling from library/httpd
eff15d958d66: Already exists
ba1caf8ba86c: Pull complete
ab86dc02235d: Pull complete
0d58b11d2867: Pull complete
e88da7cb925c: Pull complete
Digest: sha256:1d71eef54c08435c0be99877c408637f03112dc9f929fba3cccdd15896099b02
Status: Downloaded newer image for httpd:latest
aa20e785c44ffb1e1640607a28900c1053561e07da493d2005eed57140c1b22d
docker ps
查看本地容器进程
docker ps #查看容器运行状态
选项:
-a #显示所有的容器,包括未运行的
-q #只显示容器id
-l #显示最近创建的容器。
-f "筛选条件" #根据条件过滤显示的内容
示例:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
599606d03bf3 nginx "/docker-entrypoint.…" 58 seconds ago Created silly_hawking
8a279920b42e nginx "/docker-entrypoint.…" 2 hours ago Created nginx01
CONTAINER ID #容器 ID
IMAGE #使用的镜像
COMMAND #启动容器时运行的命令
CREATED #容器的创建时间
STATUS #容器状态
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS #容器的端口信息和使用的连接类型(tcp\udp)。
NAMES #容器名称
docker run
容器启动
docker run 选项 容器 命令
选项:
--name #指定容器的名称,如果不指定随机给容器生成一个名称
-i #启动一个可交互容器,并持续打开标准输出
-t #表示使用终端关联到容器的标准输入输出上
-d #将容器放在后台执行
-rm #删除容器
-p 宿主机端口:容器端口 #将宿主机端口映射给容器端口
-v 宿主机目录:容器目录 #将宿主机目录挂载到容器中
示例:
//使用nginx镜像启动一个名为nginx01的容器
[root@loclhost ~]# docker run --name nginx01 nginx
.....略......
//使用nginx镜像启动一个名为nginx01的容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run -it nginx01 /bin/bash
root@78a11416ecae:/# exit
exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
//使用nginx镜像启动一个名为nginx02的容器并在后台运行
[root@localhost ~]# docker run --name nginx02 -d nginx
5917c71a32ad685cf0227906097b2aaa894013af5a71ec2ac3effc6e225405e6
//查看所有容器状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e6ad39814957 httpd "httpd-foreground" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp httpd01
5917c71a32ad nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 80/tcp nginx02
599606d03bf3 nginx "/docker-entrypoint.…" 26 minutes ago Created silly_hawking
8a279920b42e nginx "/docker-entrypoint.…" 2 hours ago Up 3 seconds 80/tcp nginx01
//停止容器
[root@localhost ~]# docker stop nginx01
nginx01
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a279920b42e nginx "/docker-entrypoint.…" 2 hours ago Exited (0) 5 seconds ago nginx01
//停止所有容器
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5917c71a32ad nginx "/docker-entrypoint.…" 3 hours ago Up 9 seconds 80/tcp nginx02
8a279920b42e nginx "/docker-entrypoint.…" 5 hours ago Up 11 seconds 80/tcp nginx01
[root@localhost ~]# docker stop $(docker ps -aq)
e6ad39814957
5917c71a32ad
8a279920b42e
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
//启动容器
[root@localhost ~]# docker start nginx01
nginx01
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a279920b42e nginx "/docker-entrypoint.…" 2 hours ago Up 3 seconds 80/tcp nginx01
//重启容器
[root@localhost ~]# docker restart nginx01
nginx01
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a279920b42e nginx "/docker-entrypoint.…" 5 hours ago Up 13 seconds 80/tcp nginx01
容器生命周期管理命令
docker start 容器名 #开启容器
docker stop 容器名 #停止容器
docker kill 容器名 #杀死容器
docker restart 容器名 #重启容器
docker pause 容器名 #暂停容器中所有的进程
docker unpause 容器名 #恢复容器中所有的进程
docker logs
容器日志查看命令
docker logs 容器名 #获取容器的日志信息
选项:
-f #跟随打印最新的日志追加在最后面
-t #显示日志打印的时间戳
--tail 数量 #只显示最新的指定数量的几条日志信息
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a279920b42e nginx "/docker-entrypoint.…" 5 hours ago Up 13 seconds 80/tcp nginx01
[root@localhost ~]# docker logs 8a279920b42e
[root@localhost ~]# docker logs nginx01 --tail 5
2021/12/01 14:21:40 [notice] 1#1: OS: Linux 3.10.0-862.el7.x86_64
2021/12/01 14:21:40 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2021/12/01 14:21:40 [notice] 1#1: start worker processes
2021/12/01 14:21:40 [notice] 1#1: start worker process 24
2021/12/01 14:21:40 [notice] 1#1: start worker process 25
docker rm
容器删除命令
docker rm 容器名 #删除容器,无法删除运行状态下的容器
选项:
-f #强制,可以删除运行状态下的容器
示例:
//删除aa69d845c204容器
[root@localhost ~]# docker stop aa69d845c204
aa69d845c204
[root@localhost ~]# docker rm aa69d845c204
aa69d845c204
//批量删除所有容器
[root@localhost ~]# docker rm $(docker ps -aq)
e6ad39814957
5917c71a32ad
docker exec
不进入容器执行容器中的命令
docker exec 容器名 执行命令 #不进入容器执行容器中的命令
选项:
-d #后台执行,不显示结果
-it #为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端
示例:
//不进入容器执行容器中的ls命令
[root@localhost ~]# docker exec nginx01 ls
bin
boot
dev
......
//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@8a279920b42e:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@8a279920b42e:/# exit
exit
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8a279920b42e nginx "/docker-entrypoint.…" 5 hours ago Up 10 minutes 80/tcp nginx01
[root@localhost ~]#
docker inspect
查看容器详细信息
docker inspect 容器名 #查看容器详细信息
示例:
[root@localhost ~]# docker inspect httpd01
......略
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
......略
[root@localhost ~]# curl 172.17.0.3
<html><body><h1>It works!</h1></body></html>