0%

Docker基本命令

Docker是基于go语言开发实现,基于Linux内核的cgroupnamespace,以及OverlayFS类的Union FS等技术,对进程进行封装隔离,位于操作系统层面的虚拟化技术。由于隔离的进程独立于其他的隔离的进程,也称之为容器,Docker充当容器引擎。Docker是一个划时代的开源项目,它彻底释放了计算虚拟化的威力!

工作机制

[TOC]

Docker在容器的基础之上,进一步提高了封装技术,做到从文件系、网络互连到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟机技术更为轻便、快捷。

Docker与Virtual Machines技术的区别

传统虚拟化

  • 从图中可以看出,在虚拟机技术中,要先在宿主机操作系统中虚拟出一套硬件之后,在其上运行一个完整的操作系统,然后在此操作系统上运行所需的应用进程。

Docker

  • 而在容器中,应用进程直接运行于宿主的内核,容器没有自己的内核,也没有进行硬件虚拟,节约了大量的资源。
特性 容器 虚拟机
启动速度 秒级 分钟级
硬盘使用 一般为MB 一般为GB
性能 接近原生 更弱
系统支持量 单机支持上千个容器 一般几十个

Doker的优点

  • 更高效的利用系统资源

  • 更快速的启动时间

  • 应用开发、测试、部署一致的运行环境

  • 持续交付和部署

  • 更轻松的迁移

  • 更轻松的维护和扩展

Docker配置及部署

  • 下载Docker的yum源
1
2
3
$ cd /etc/yum.repos.d  #yum仓库配置目录
$ wget https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
$ sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' docker-ce.repo
1
$ yum -y install docker-ce
  • 安装Docker Community Edition(Docker CE)即社区版docker

  • 配置镜像加速器

1
2
3
4
5
6
7
8
9
10
11
12
13
$ vim /etc/docker/daemon.json

{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.ccs.tencentyun.com",
]
}
#这将提高我们从docker仓库中拉取镜像的速度和稳定性

$ systemctl daemon-reload
$ systemctl restart docker.service
  • 一些操作指令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#查看docker版本
$ docker version

#查看docker信息
$ docker info

#启动docker服务
$ systemctl start docker.service

#关停docker服务
$ systemctl stop docker.service

#重启docker服务
$ systemctl stop docker.service

#查看docker运行状态
$ systemctl status docker.service

Docker基本概念

Docker的基本概念主要包括

  1. 镜像(image
  2. 容器(container
  3. 仓库(repository

理解了这三个概念,就理解了Docker的整个生命周期

image基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#列出镜像文件
$ docker image ls

#搜索镜像
$ docker search <iamge_name>

#拉取镜像
$ docker pull <iamge_name>:<tag>

#导出镜像
$ docker iamge save <image_name>:<tag> > /path/<image_name>.tar.gz

#导入镜像
$ docker iamge load -i /path/<iamge_name>.tar.gz

#删除镜像
$ docker image rmi <iamge_name>:<tag>/<image_id>

#查看镜像详细信息
$ docker image inspect <image_name>:<tag>

container基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
#列出容器
$ docker container ls

#停止/杀死/重启容器
$ docker container stop/kill/restart <container_name/id>

#删除容器
$ docker container re <container_name/id>

#退出容器
$ exit
#or
$ crtl+p -> crtl+q
  • 创建并启动第一个容器
1
$ docker container run -itd -p 8080:80 --name websever nginx:1.21
  • docker container run: 这是启动 Docker 容器的命令。

  • -itd: 这是一组选项,表示:

    • -i:与容器的标准输入保持开放(interactive)。
    • -t:为容器分配一个伪终端(tty)。
    • -d:在后台运行容器。

      这组选项通常用于在后台运行交互式容器。

  • -p 8080:80: 这个选项表示将主机的端口 8080 映射到容器的端口 80。这样,外部请求通过主机的 8080 端口可以访问容器内运行的 Nginx 服务。

  • --name websever: 这个选项为容器指定一个名称,即 “websever”。这使得你可以使用容器名称而不是容器 ID 来引用该容器。

  • nginx:1.21: 这是要运行的 Docker 镜像的名称及其标签。在这里,它是 Nginx 镜像的版本 1.21。

综合起来,这个命令的作用是在后台运行一个交互式的 Nginx 容器,将主机的 8080 端口映射到容器的 80 端口,并指定容器的名称为 “websever”。

进入容器的两种方法以及区别

  • 进入容器之前,容器要处于运行状态
1
2
3
4
5
#第一种
$ docker container exec -it <container_name_or_id> /bin/bash

#第二种
$ docker container attach <container_name_or_id>

区别:

  • 使用 docker exec 不会改变容器主进程,而是在容器的运行时环境中执行一个新的进程。
  • 可以多次使用 docker exec 进入同一个容器,每次进入都是一个新的 shell。
  • 如果没有指定 <command>,默认是在容器的默认 shell 中执行。
  • 使用 docker attach 将连接到容器的主进程(通常是启动容器时指定的主命令,例如 shell)。
  • docker attach 不支持在容器内启动新的进程,而是将当前终端附加到容器的标准输入、输出和错误流上。
  • 如果从容器中断开连接(Ctrl + P, Ctrl + Q),容器将保持运行状态。
exit ctrl+p->ctrl+q
exec 退出不停止容器 退出不停止容器
attach 退出停止容器 退出不停止容器

容器与宿主机之间传输文件

1
2
3
4
#容器到宿主机
$ docker cp <container_id_or_name>:/container_path/ /os_path/

$ docker cp /os_path/ <container_id_or_name>:/container_path/

repository基本操作

1
2
3
4
5
6
7
8
9
10
$ docker login  #登陆远程仓库,在这之前要注册一个dockerhub账号
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: lgq007
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

$ docker logout #退出仓库
Removing login credentials for https://index.docker.io/v1/

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

数据卷

1
2
3
4
5
6
7
8
9
#创建数据卷
$ docker volume create <volume_name>

#查看数据卷
$ docker volume ls

#查看数据卷信息
$ docker volume inspect <volume_name>

创建数据卷

1
2
3
4
$ docker volume create --name webserver_volume \
--opt type=tmpfs \
--opt device=tmpfs \
--opt o=size=100m
  • 启动
1
2
3
4
5
$ docker container run 
-itd
--name webserver
-p 80:80
-v webserver_volume:/usr/share/nginx/html nginx:1.21 /bin/bash

查看数据卷详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ docker volume inspect webserver_volume

[
{
"CreatedAt": "2023-12-09T21:41:28+08:00",
"Driver": "local",
"Labels": null,
#<-数据卷的挂载位置->
"Mountpoint":"/var/lib/docker/volumes/docker_volume/_data",
"Name": "webserver_volume",
"Options": {
"device": "tmpfs",
"o": "size=100m",
"type": "tmpfs"
},
"Scope": "local"
}
]

#测试:
$ echo "hello docker volume create" >/var/lib/docker/volumes/docker_volume/_data/index.html

$ curl http://192.168.57.100:80

挂载宿主机目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#以安装nginx为例

#1.在宿主机先创建一个目录
$ mkdir /usr/local/docker_volume

#2.挂载命令

-v <hostpath>:<containerpath>

#3.挂载到宿主机目录
$ docker container run
-itd
--name webserver
-p 80:80
-v /usr/local/docker_volume:/usr/share/nginx/html nginx:1.21

1
2
#拉取一个网页主要信息到指定目录
wget www.baidu.com -O /usr/local/docker_volume
  • -O: 指定保存下载文件的路径和文件名。在这个例子中,文件将被保存为 /usr/local/docker_volume

欢迎关注我的其它发布渠道