Docker学习笔记

297 阅读5分钟

一、容器和虚拟机的区别

虚拟机我们都知道,可以在一种操作系统里面运行另一种操作系统。但是虚拟机占用资源较多,而且启动较慢,不适合快速部署项目。

基于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。可以简单的认为容器就是轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多

下图是两者的详细区别:

image.png

二、什么是Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

Docker 的主要用途,目前有三大类:

  1. 提供一次性的环境。比如,本地测试他人的软件、持续集成的时候提供单元测试和构建的环境。
  2. 提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
  3. 组建微服务架构。通过多个容器,一台机器可以跑多个服务,因此在本机就可以模拟出微服务架构。

Docker由以下几部分组成:

  • Docker daemon :在宿主机上运行,Docker守护进程

  • Dokcer clientDocker命令行工具,用户通过docker clientdocker deamon通信。也可以使用本地的docker client与远程的docker daemon进行通信

  • Docker image:镜像是只读的,镜像中包含由需要运行的文件。镜像用来创建container,一个镜像可以运行多个container;镜像可以通过Dockerfile创建,也可以从Docker hub/registry上下载

  • Docker containerDocker容器,是Docker的运行组件,启动一个镜像就是一个容器,容器是一个隔离环节,多个容器之间不会相互影响,保证容器中的程序运行在一个相对安全的环境中。

  • Docker hub/registry:共享和管理Docker镜像,用户可以上传或下载镜像,也可以搭建自己私有的Docker registry

官方文档地址:Reference documentation | Docker Docs

三、安装Docker

ubuntu安装docker

  1. 更新包索引:

    sudo apt update
    
  2. 安装必要的依赖项:

    sudo apt install -y \
      apt-transport-https \
      ca-certificates \
      curl \
      gnupg-agent \
      software-properties-common
    
  3. 添加Docker官方GPG密钥:

    # 官方密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    
    # 阿里云密钥(二者选其一即可)
    # curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
    
  4. 设置稳定版仓库:

    # 官方地址
    sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
     
    # 阿里云地址(二者选其一即可)
    # sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
    
  5. 再次更新包索引以包含新添加的Docker仓库:

    sudo apt update
    
  6. 安装Docker Engine、CLI和containerd:

    sudo apt install -y docker-ce docker-ce-cli containerd.io
    
  7. 启动并启用Docker服务:

    sudo systemctl start docker
    sudo systemctl enable docker
    
  8. (可选)将当前用户添加到docker组,以便无需使用sudo就能运行Docker命令:

    sudo usermod -aG docker $USER
    

    注意: 重新登录或者执行以下命令以使用户组更改生效:

    su - $USER
    
  9. 验证

    查看安装的版本:docker -v

四、常用命令

docker命令官方文档:Use the Docker command line | Docker Docs

4.1 docker系统相关命令

  1. 运行Docker守护进程:sudo systemctl start docker
  2. 停止Docker守护进程:sudo systemctl stop docker
  3. 重启Docker守护进程:sudo systemctl restart docker
  4. 设置Docker开机自启动:sudo systemctl enable docker
  5. 查看Docker的运行状态:sudo systemctl status docker
  6. 重新加载docker配置文件:sudo systemctl daemon-reload
  7. 查看docker版本:docker -v
  8. 查看docker信息:docker info

4.2 docker镜像相关命令

1)查找docker镜像

docker search image_name

2)从远程仓库拉取镜像

docker pull image_name[:TAG]

默认远程仓库为registry.hub.docker.com/。不指定`TAG`时,…

后续凡涉及到镜像名称的都会有TAG,如果未指定则默认为latest

3)查看本地所有镜像

docker images

参数说明:

  • -q:查询结果只返回镜像idimage_id

4)查看指定镜像元数据

docker inspect image_id/image_name[:TAG]

查看镜像构建历史:docker history image_id/image_name[:TAG]

5)构建镜像

docker build -f dockerfile_path -t image_name[:TAG] .

.表示在当前目录下执行,也就是说dockerfile_path是相对于当前目录的路径

参数说明:

  • -f:指定dockerfile文件位置

  • -t:指定构建的镜像名称

  • --no-cache:构建镜像时不使用缓存

6)上传镜像到远程仓库

docker push image_name

7)删除镜像

需要保证要删除的镜像没有对应的容器,否则需要先删除容器

docker rmi image_id/image_name[:TAG]

删除所有镜像

先查询所有的镜像id,然后删除

docker rmi $(docker images -q)

删除所有未使用镜像

docker image prune

8)运行镜像

docker run image_id/image_name[:TAG]

参数说明:

  • -d:后台运行容器,并返回容器ID
  • -i:让容器的标准输入保持打开
  • -t:让docker分配一个伪终端并绑定到容器的标准输入上,一般情况下 -it一起使用
  • -p:指定端口映射,格式为:host_port:container_port,将本机的端口映射到指定的容器端口
  • -v:创建一个数据卷挂载到容器中,可以通过此参数将宿主机目录挂载到容器中,格式为:host_directory:contaioner_directory。如 -v /root/maven:/maven表示将宿主机中的根目录下root目录中的maven目录挂载到容器里的根目录下的maven目录中。
  • -e:指定环境变量,如-e TZ="As1a/shangha1"指定时区
  • –-name:指定镜像运行后的容器的名称

9)进入镜像

不可以通过命令直接进入镜像,必须先运行镜像,然后进入相关容器。

可以通过如下命令运行镜像并进入容器:docker run -it image_id/image_name bash

exit :停止退出容器

Ctrl+P+Q:不停止退出容器

10)修改镜像

  1. 先启动容器,如将宿主机的某一目录挂载到容器中

    docker run -it -v /root/maven:/maven image_id/image_name[:TAG] bash

  2. 进入容器,可以进行一系列操作,操作修改后exit退出

  3. 然后使用commit命令来提交更改

    docker commit -m '提交的描述信息' container_id new_image_name[:TAG]

    • container_id 为1中运行镜像生成的容器id
    • new_image_name为新的生成的镜像名称
  4. 执行成功后会返回生成的新的镜像ID,可以使用docker images查看改镜像ID、仓库名和tag信息

4.3 docker容器相关命令

1)查看运行中的容器

docker ps

参数说明:

  • -a:查看所有容器,包括未运行的
  • -q:只返回容器id

2)查看所有容器

docker ps -a

3)启动、停止、重启容器

docker start container_id/container_name

docker stop container_id/container_name

docker restart container_id/container_name

4)查看容器状态

docker stats

5)进入容器

docker attach:进入容器正在执行的终端,可以看下容器的实时日志

docker exec -it container_id/container_name bash:进入容器后开启新的终端,可以在里面执行各种操作

6)查看容器日志

docker logs container_id/container_name

参数说明:

  • -f:跟踪日志输出

7)删除容器

docker rm container_id/container_name

参数说明:

  • -f:强制删除,即使容器正在运行

8)删除所有未运行的容器

docker rm $(docker ps -aq)

加上-f就是删除所有容器了

9)拷贝容器文件

将容器中的文件拷贝到主机

docker cp 容器id:container_path host_path

五、Dockerfile文件

Dockerfile文件详细用法参照官方文档:Dockerfile reference | Docker Docs

这里简单给出部分常用命令的用法

FROM			# 指定从那个镜像开始构建
MAINTAINER		# 镜像作者:姓名+邮箱
RUN				# 镜像构建是执行的命令
ADD				# 给镜像添加内容
WORKDIR			# 指定镜像的工作目录,是镜像内部的目录,不是宿主机的工作目录
VOLUME			# 挂载的目录
EXPOSE			# 暴露端口
CMD				# 指定镜像运行时要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT		# 指定镜像运行时要运行的命令
COPY			# 类似ADD,将文件拷贝到镜像中
ENY				# 构建时设置环境变量