docker介绍及其基础命令用法
文章目录1. 什么是docker1.1 OCI&OCF1.2 Docker引擎架构1.3 Docker运行架构1.4 docker架构2. docker镜像与镜像仓库3. docker对象4. docker的安装及使用4.1 docker安装4.2 docker加速4.3 docker常用操作4.3.1 镜像操作4.3.2 容器操作1. 什么是dockerDocker是一个开源的应用容器引
文章目录
1. 什么是docker
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。
docker中的容器:
- lxc --> libcontainer --> runC
1.1 OCI&OCF
OCI
开放容器倡议:
- 由Linux基金会主导于2015年6月创立
- 旨在围绕容器格式和运行时制定一个开放的工业化标准
包含两个规格
- 运行时规范(runtime-spec)
- 镜像规范(image-spec)
OCF
开放式容器格式:
runC 是一个 CLI 工具,用于根据 OCI 规范生成和运行容器
- 容器作为 runC 的子进程启动,可以嵌入到各种其他系统中,而无需运行守护进程
- runC 建立在 libcontainer 之上,同样的容器技术为数百万个 Docker 引擎安装提供支持
docker提供了一个专门容纳容器镜像的站点:点此
1.2 Docker引擎架构
1.3 Docker运行架构
1.4 docker架构
2. docker镜像与镜像仓库
在docker中仓库的名字是以应用的名称取名的,镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
3. docker对象
当你使用 docker 时,相当于正在创建和使用图像、容器、网络、卷、插件和其他对象。
- IMAGES (镜像)
-
图像是一个只读模板,其中包含创建 docker 容器的说明。
-
一般情况下,一个镜像基于另一个镜像,并带有一些额外的自定义。
-
镜像的获取:
- 从远程仓库下载
- 朋友拷贝给你
- 自己制作docker镜像(DockerFile)
- CONTAINERS (容器)
- 容器是镜像的可运行实例。
- 您可以使用 docker API 或 CLI 创建、运行、停止、移动或删除容器。
- 您可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新镜像。
4. docker的安装及使用
4.1 docker安装
//配置yum仓库
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
//配置docker的yum源
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1919 100 1919 0 0 12380 0 --:--:-- --:--:-- --:--:-- 12380
[root@localhost yum.repos.d]# ls
CentOS-Base.repo CentOS-Linux-ContinuousRelease.repo CentOS-Linux-Extras.repo CentOS-Linux-Media.repo CentOS-Linux-Sources.repo
CentOS-Linux-AppStream.repo CentOS-Linux-Debuginfo.repo CentOS-Linux-FastTrack.repo CentOS-Linux-Plus.repo docker-ce.repo
CentOS-Linux-BaseOS.repo CentOS-Linux-Devel.repo CentOS-Linux-HighAvailability.repo CentOS-Linux-PowerTools.repo
[root@localhost yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
//下载docker所需要的环境
[root@localhost yum.repos.d]# yum install -y yum-utils device-mapper-persistent-data lvm2
//安装docker
[root@localhost yum.repos.d]# yum -y install docker-ce
4.2 docker加速
一般来说docker下载镜像相当缓慢,需要配置加速来使用
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
- docker cn
- 中国科技大学加速器
- 阿里云加速器(需要通过阿里云开发者平台注册帐号,免费使用个人私有的加速器)
设置阿里云镜像加速
[root@localhost ~]# systemctl start docker
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
> {
> "registry-mirrors": ["写自己的阿里云加速地址"]
> }
> EOF
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# systemctl daemon-reload
4.3 docker常用操作
命令 | 功能 |
---|---|
docker search | 从Docker Hub镜像仓库上查找镜像 |
docker pull | 从Docker Hub镜像仓库上拉取镜像 |
docker images | 列出本地的镜像 |
docker create | 创建一个新的容器(与run命令不同,使用create命令只能创建容器而并不启动) |
docker start | 启动容器 |
docker run | 根据镜像新建并启动容器 |
docker attach | 进入到一个正在运行容器内(使用exit命令退出后,容器会停止) |
docker ps | 列出当前所有正在运行的容器 |
docker logs | 获取容器的日志 |
docker restart | 重新启动容器 |
docker stop | 停止正在运行的容器 |
docker kill | 杀死正在运行的容器 |
docker rm | 删除容器 |
docker exec | 进入到一个正在运行容器内(使用exit命令退出后,容器会继续运行) |
docker info | 显示当前系统信息、docker容器、镜像个数、设置等信息 |
docker inspect | 用于以JSON格式显示容器与镜像的详细信息 |
//查看docker的版本信息
[root@localhost ~]# 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:36:58 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:35:20 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
//查看docker的详细信息
[root@localhost ~]# docker info
Client: #docker客户端信息
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: #docker服务器端信息
Containers: 0 #容器数量
Running: 0 #正在运行的数量
Paused: 0 #暂停的数量
Stopped: 0 #已停止的数量
Images: 0 #镜像数量
Server Version: 20.10.11 #docker服务器版本
Storage Driver: overlay2 #docker存储驱动程序
Backing Filesystem: xfs #文件系统
Supports d_type: true
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file #日志驱动程序
Cgroup Driver: cgroupfs #Cgroup驱动程序
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 #Swarm状态
Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
Default Runtime: runc #默认runtime
Init Binary: docker-init
containerd version: 7b11cfaabd73bb80907dd23182b9347b4245eb5d
runc version: v1.0.2-0-g52b36a2
init version: de40ad0
Security Options: #安全选项
seccomp
Profile: default
Kernel Version: 4.18.0-305.3.1.el8.x86_64 #linux内核版本
Operating System: CentOS Linux 8 #linux操作系统
OSType: linux
Architecture: x86_64
CPUs: 2 #宿主机CPU数量
Total Memory: 1.748GiB #宿主机内存
Name: localhost.localdomain #宿主机名称
ID: XNOI:YZS3:33XD:GJ5P:LI5T:IMNW:2J2E:H737:LJNR:K2CC:FSRJ:WGLG
Docker Root Dir: /var/lib/docker #docker根目录
Debug Mode: false
Registry: https://index.docker.io/v1/ #镜像仓库
Labels:
Experimental: false
Insecure Registries: #非安全镜像仓库
127.0.0.0/8
Registry Mirrors: #镜像加速器
https://xxxxxxx.mirror.aliyuncs.com/
Live Restore Enabled: false
4.3.1 镜像操作
//从docker仓库中搜索镜像
[root@localhost ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 6904 [OK]
ansible/centos7-ansible Ansible on Centos7 135 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 131 [OK]
jdeathe/centos-ssh OpenSSH / Supervisor / EPEL/IUS/SCL Repos - … 121 [OK]
centos/systemd systemd enabled base container. 105 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 92
imagine10255/centos6-lnmp-php56 centos6-lnmp-php56 58 [OK]
......
NAME //镜像仓库源的名称
DESCRIPTION //表示该镜像的功能
STARS //表示下载热度
OFFICIAL //是否docker官方发布
AUTOMATED //自动构建
.....
//从docker仓库中下载镜像
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
//查看本地主机上的所有/指定镜像
docker images [镜像名]
选项:
-a //列出本地所有的镜像;
--digests //显示镜像的摘要信息;
-q //只显示镜像ID。
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 months ago 231MB
REPOSITORY //镜像的仓库源
TAG //镜像标签
IMAGE ID //镜像ID
CREATED //镜像创建时间
SIZE //镜像大小
//获取镜像的详细信息
[root@localhost ~]# docker inspect centos:latest
[
{
"Id": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"RepoTags": [
"centos:latest"
],
"RepoDigests": [
"centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177"
],
"Parent": "",
"Comment": "",
"Created": "2021-09-15T18:20:05.184694267Z",
"Container": "9bf8a9e2ddff4c0d76a587c40239679f29c863a967f23abf7a5babb6c2121bf1",
"ContainerConfig": {
"Hostname": "9bf8a9e2ddff",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
.....略
//添加镜像标签,类似于别名
[root@localhost ~]# docker tag centos:latest centos:1.1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 1.1 5d0da3dc9764 2 months ago 231MB
centos latest 5d0da3dc9764 2 months ago 231MB
//删除镜像
docker rmi 镜像名:标签
选项:
-f //强制删除
[root@localhost ~]# docker rmi centos:1.1
Untagged: centos:1.1
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 2 months ago 231MB
//导出镜像
[root@localhost ~]# docker save -o /tmp/centos centos:latest
[root@localhost ~]# cd /tmp
[root@localhost tmp]# ls
centos
//载入镜像
[root@localhost ~]# docker load < /tmp/centos
Loaded image: centos:latest
4.3.2 容器操作
容器创建命令
docker run //从镜像运行一个容器
选项:
--name //指定容器的名称,如果不指定随机给容器生成一个名称
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
-d //容器以守护进程的方式运行
-p 宿主机端口:容器端口 //将宿主机端口映射给容器端口
-v 宿主机目录:容器目录 //将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
-e //启动容器时传递环境及其值
--rm //容器退出时删除容器
--cpuset-cpus CPU序号 //容器能够使用哪些物理cpu
--cpu-shares 数值 //CPU共享权值(相对权重)
--memory 数值 //容器内存限制,单位b,k,m,g
--memory-swap 数值 //容器内存+交换分区大小,不能小-m的值
--restart 策略 //指定容器停止后的重启策略
no //容器退出时不重启
on-failure //容器故障退出(返回值非零)时重启
always //容器退出时总是重启
--network 网络名称 //容器网络设置
bridge //使用桥接模式
host //容器使用主机的网络
container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
none //容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
--link 容器名称 //指定容器间的关联,可以和指定容器进行通信
//用centos镜像来创建一个叫centos01的容器
[root@localhost ~]# docker create --name centos01 centos
03a5336c593df090c777ea1f7344cc410381b25a28884d674d2cd72d45aa5076
//使用centos镜像启动一个名为centos02的容器并分配一个bash shell的终端进入容器
[root@localhost ~]# docker run --name centos02 -it centos /bin/bash
[root@30631e320b4f /]# exit
exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
//使用centos镜像启动一个名为centos03的容器并在后台运行
[root@localhost ~]# docker run --name centos03 -d centos
d7d3b91954d32b9cf9b9e9b2f8463c1f3cb923d69cdadf4738d7482a65f6dce3
//使用centos镜像启动一个名为centos04的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@localhost ~]# docker run --name centos04 -d -p 8080:80 centos
d147a3cf5693bc7ea8aac00ab84f06e3166a3746c252a9c14d92c61a3ed8992e
容器查看命令
docker ps //查看容器运行状态
选项:
-a //显示所有的容器,包括未运行的
-q //只显示容器id
-l //显示最近创建的容器。
-f "筛选条件" //根据条件过滤显示的内容
//查看所有容器状态
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d147a3cf5693 centos "/bin/bash" 32 seconds ago Exited (0) 31 seconds ago centos04
d7d3b91954d3 centos "/bin/bash" 2 minutes ago Exited (0) 2 minutes ago centos03
30631e320b4f centos "/bin/bash" 3 minutes ago Exited (0) 3 minutes ago centos02
03a5336c593d centos "/bin/bash" 7 minutes ago Created centos01
CONTAINER ID //容器 ID
IMAGE //使用的镜像
COMMAND //启动容器时运行的命令
CREATED //容器的创建时间
STATUS //容器状态
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS //容器的端口信息和使用的连接类型(tcp\udp)。
NAMES //容器名称
//查看容器详细信息
[root@localhost ~]# docker inspect centos04
[
{
"Id": "d147a3cf5693bc7ea8aac00ab84f06e3166a3746c252a9c14d92c61a3ed8992e",
"Created": "2021-12-01T18:24:37.775412386Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "exited",
"Running": false,
.....略
容器生命周期管理命令
docker start 容器名 //开启容器
docker stop 容器名 //停止容器
docker kill 容器名 //杀死容器
docker restart 容器名 //重启容器
docker pause 容器名 //暂停容器中所有的进程
docker unpause 容器名 //恢复容器中所有的进程
容器占用资源查看命令
docker stats 容器名 //查看容器使用资源信息
docker top 容器名 //查看容器中运行的进程信息,支持ps命令参数
docker port 容器名 //查看宿主机端口和容器端口之间的端口映射
容器日志查看命令
docker logs 容器名 //获取容器的日志信息
选项:
-f //跟随打印最新的日志追加在最后面
-t //显示日志打印的时间戳
--tail 数量 //只显示最新的指定数量的几条日志信息
** 容器内进程连接和命令执行**
//创建一个后台运行容器
[root@localhost ~]# docker run --name centos05 -d -it centos /bin/bash
4054570d47c1be7460546ab923f6d5e2709a0ec74775d0f6a748be1a3bc90696
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4054570d47c1 centos "/bin/bash" 5 seconds ago Up 4 seconds centos05
d147a3cf5693 centos "/bin/bash" 8 minutes ago Exited (0) 8 minutes ago centos04
d7d3b91954d3 centos "/bin/bash" 10 minutes ago Exited (0) 2 minutes ago centos03
30631e320b4f centos "/bin/bash" 11 minutes ago Exited (0) 11 minutes ago centos02
03a5336c593d centos "/bin/bash" 15 minutes ago Exited (0) 2 minutes ago centos01
//连接到正在运行的容器进程中,默认连接到容器启动时启动的进程
[root@localhost ~]# docker attach centos05
[root@4054570d47c1 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
//不进入容器执行容器中的命令
docker exec 容器名 执行命令
选项:
-d //后台执行,不显示结果
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端
[root@localhost ~]# docker exec centos05 ls
bin
dev
etc
home
lib
lib64
lost+found
media
....略
//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@localhost ~]# docker exec -it centos05 /bin/bash
[root@4054570d47c1 /]# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4054570d47c1 centos "/bin/bash" 4 minutes ago Up 4 minutes centos05
d147a3cf5693 centos "/bin/bash" 12 minutes ago Exited (0) 12 minutes ago centos04
d7d3b91954d3 centos "/bin/bash" 14 minutes ago Exited (0) 6 minutes ago centos03
30631e320b4f centos "/bin/bash" 16 minutes ago Exited (0) 16 minutes ago centos02
03a5336c593d centos "/bin/bash" 19 minutes ago Exited (0) 6 minutes ago centos01
宿主机和容器文件复制命令
docker cp 容器名:容器文件路径 宿主机路径 //将容器中的文件复制到宿主机中
docker cp 宿主机路径 容器名:容器文件路径 //将宿主机中的文件复制到容器中
容器导出和导入命令
docker export 容器名 > 导出的容器文件名 //容器导出
docker import 导出的容器文件名 镜像:标签 //容器导入,导入之后只会生成镜像
容器删除命令
docker rm 容器名 //删除容器,无法删除运行状态下的容器
选项:
-f //强制,可以删除运行状态下的容器
[root@localhost ~]# docker rm centos01
centos01
[root@localhost ~]# docker rm centos05
Error response from daemon: You cannot remove a running container 4054570d47c1be7460546ab923f6d5e2709a0ec74775d0f6a748be1a3bc90696. Stop the container before attempting removal or force remove
[root@localhost ~]# docker rm -f centos05
centos05
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d147a3cf5693 centos "/bin/bash" 15 minutes ago Exited (0) 15 minutes ago centos04
d7d3b91954d3 centos "/bin/bash" 16 minutes ago Exited (0) 9 minutes ago centos03
30631e320b4f centos "/bin/bash" 18 minutes ago Exited (0) 18 minutes ago centos02
//批量删除所有容器
[root@localhost ~]# docker rm `docker ps -qa`
d147a3cf5693
d7d3b91954d3
30631e320b4f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)