【容器技术——Docker基本使用】

news2024/12/26 15:35:13

文章目录

  • docker
    • 1 概述
      • 1.1 是什么
      • 1.2 相关资源
    • 2 使用
      • 2.1 镜像
        • 2.1.1 拉取镜像
        • 2.2.2 列出镜像
        • 2.2.3 删除镜像
      • 2.2 容器
        • 2.2.1 运行容器
        • 2.2.2 查看容器
        • 2.2.3 启动和关闭容器
        • 2.2.4 删除容器
      • 2.3 制作镜像
      • 2.4 Docker 仓库
        • 2.4.1 注册登录
        • 2.4.2 推送镜像
      • 2.5 dockerfile
        • 2.5.1 构建镜像
        • 2.5.2 dockerfile示例
    • 3 实战开发
    • 4 Docker 命令大全
      • 容器生命周期管理
      • 容器操作
      • 容器rootfs命令
      • 镜像仓库
      • 本地镜像管理
      • info|version

docker

1 概述

1.1 是什么

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)

Docker支持将软件编译成一个镜像,然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。运行中的这个镜像称为容器,容器启动是非常快速的。

即打包好的软件,所有环境都配置好了,开箱即用,无需再配置

  • 镜像,打包好的软件,发布出去,相当于软件的模板(类似于Java中的类class)
  • 容器,获取镜像到本地,运行起来,就是一个容器(类似于Java中类的实例)
  • docker宿主机,就是本机
  • docker仓库,存放镜像的地方,类似于git
  • docker注册仓库服务器,存放仓库的地方,相当于github

在这里插入图片描述

1.2 相关资源

文章参考:

  • https://blog.csdn.net/u010358168/article/details/86711551?spm=1001.2014.3001.5506
  • https://blog.csdn.net/qq_39611230/article/details/108641842

相关资源:

  • Docker 官方主页: https://www.docker.com
  • Docker 官方博客: https://blog.docker.com/
  • Docker 官方文档: https://docs.docker.com/
  • Docker Store: https://store.docker.com
  • Docker Cloud: https://cloud.docker.com
  • Docker Hub: https://hub.docker.com
  • 阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
  • 网易加速器:http://hub-mirror.c.163.com
  • 官方中国加速器:https://registry.docker-cn.com
  • ustc 的镜像:https://docker.mirrors.ustc.edu.cn

2 使用

2.1 镜像

2.1.1 拉取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub(docker.io)
  • 仓库名: <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像
  • 版本,mysql不加版本则默认为最新mysql:latest
# 官方镜像
docker image pull 镜像名称 
# 或简写为 
docker pull 镜像名称
# 比如
docker pull ubuntu
docker pull ubuntu:18.04

# 个人镜像
docker pull 仓库名称/镜像名称
docker pull xunmi/django

# 第三方仓库拉去
docker pull 第三方仓库地址/仓库名称/镜像名称
docker pull hub.c.163.com/library/mysql:latest
(默认仓库名为library,所有从官方获取镜像相当于`sudo docker image pull library/镜像名称`)

2.2.2 列出镜像

docker image ls
# 或者
docker images

docker image ls ubuntu:18.04

2.2.3 删除镜像

docker image rm 镜像名/镜像ID 
# 或简写为
docker rmi 镜像名/镜像ID

docker image rm hello-world
docker rmi 9e64176cd8a2

2.2 容器

2.2.1 运行容器

镜像只是一个只读类型的文件,我们需要把这个镜像加载成我们的环境,也就是让他变成容器。

docker run [可选参数] 镜像名 [向启动容器中传入的命令]
常用可选参数作用
-i表示以交互式操作运行容器。
-d会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
-t表示容器启动后会进入其命令行。 -it表示容器需要交互式终端 ,即分配一个伪终端。
–name为创建的容器命名。(默认会随机给名字,不支持中文字符!!!)
-v目录映射,即宿主机目录:容器中目录。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p端口映射,即宿主机端口:容器中端口。 比如:-p 8080:80 就是将容器中的80端口,映射到主机中的8080端口
-network=host表示将主机的网络环境映射到容器中,使用此命令会让容器和主机共享一个网络空间。
  • 镜像名后的是 命令,这里我们希望有个交互式 Shell,因此用的是 bash
docker run -it ubuntu:18.04 bash

# 启动docker lab容器,输入localhost:8080即可使用
docker run -d -p 8080:80 docker/getting-started

# Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello world",然后输出结果
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world"
Hello world

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMbgvnN4-1674114793665)(C:\Users\sommer.liu\Desktop\学习笔记\后端开发技术栈\docker.assets\image-20230119150147176.png)]

2.2.2 查看容器

# 查看当前所有正在运行的容器
docker ps
# 查看当前所有的容器
docker ps -a
# 使用过滤器(除了name外,常用的还可以指定id:id= 、所有停止的容器:status=exited,正在运行的容器:status=running 等)
docker ps -f name=指定的名字
# 显示2个上次创建的容器(2可以改变)
docker ps -n 2
# 显示最新创建的容器(包括所有状态)
docker ps -l
# 仅显示ip
docker ps -q
 # 显示容器大小
docker ps -s

2.2.3 启动和关闭容器

stop和kill的区别: stop类似正常退出一个软件,而kill是当一个进程出现意外无法正常关闭的时候,强行关闭,有点像使用任务管理器进行结束进程操作

# 停止容器
docker container stop 容器名/容器id
# 或可简写为
docker stop 容器名/容器id

# 强制关闭容器
docker container kill 容器名/容器id
# 或可简写为
docker kill 容器名/容器id

# 启动容器
docker container start 容器名/容器id
# 或可简写为
docker start 容器名/容器id

2.2.4 删除容器

如果报错Error response from daemon: You cannot remove a running container 容器ID. Stop the container before attempting removal or force remove则代表这个容器已经启动,需要执行 docker stop 容器id,停止此容器

# 使用rm删除容器
docker rm 容器名/容器id
# 列如
docker rm docker-test

2.3 制作镜像

# 将容器制作成镜像
docker commit 容器名 镜像名
# 镜像打包备份(打包备份的文件会自动存放在当前命令行的路径下,如果想让保存的文件可以打开,可以加.tar后缀)
docker save -o 保存的文件名 镜像名
# 镜像解压
docker load -i 文件路径/备份文件

2.4 Docker 仓库

目前 Docker 官方维护了一个公共仓库 Docker Hub。大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。

2.4.1 注册登录

在 https://hub.docker.com 免费注册一个 Docker 账号。登录需要输入用户名和密码,登录成功后,我们就可以从 docker hub 上拉取自己账号下的全部镜像。

$ docker login

img

退出 docker hub 可以使用以下命令:

$ docker logout

2.4.2 推送镜像

用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。

docker tag ubuntu:18.04 username/ubuntu:18.04 
docker push username/ubuntu:18.04

2.5 dockerfile

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像。这个脚本就是 Dockerfile。

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。以 && 符号连接命令,执行后只会创建 1 层镜像。

2.5.1 构建镜像

Dockerfile 文件所在目录执行构建动作。便可通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。

docker build [选项] <上下文路径/URL/->

docker build -t dtf_service:v1 .	#这个.是在指定上下文目录,docker build 命令会将该目录下的内容打包交给 Docker 引擎以帮助构建镜像
docker build -t nginx:v3 .  # 指定了最终镜像的名称 -t nginx:v3
# docker build 还支持从 URL 构建,比如可以直接从 Git repo 中构建
docker build -t hello-world https://github.com/docker-library/hello-world.git #master:amd64/hello-world

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。

2.5.2 dockerfile示例

from ubuntu:latest #指定基础镜像

run apt update \		# shell格式的命令,就像直接在命令行中输入的命令一样
    && apt install sudo \
    && apt install net-tools \
    && apt install jq -y \
    && mkdir /home/djitool 
    
    
copy .  /home/djitool/   # 从上下文目录中复制文件或者目录到容器里指定路径

run cd /home/djitool/ \
    && sudo ./upgrade.sh

expose 5100 5101 #声明容器运行时提供服务的端口,仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。

entrypoint ["/home/dji/dtf/start.sh","5101"]

dockerfile 的命令摘要

  • FROM- 镜像从那里来

  • MAINTAINER- 镜像维护者信息

  • RUN- 构建镜像执行的命令,每一次RUN都会构建一层

  • CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数

  • VOLUME- 定义数据卷,如果没有定义则使用默认

  • USER- 指定后续执行的用户组和用户

  • WORKDIR- 切换当前执行的工作目录

  • HEALTHCHECH- 健康检测指令

  • ARG- 变量属性值,但不在容器内部起作用

  • EXPOSE- 暴露端口

  • ENV- 变量属性值,容器内部也会起作用

  • ADD- 添加文件,如果是压缩文件也解压

  • COPY- 添加文件,以复制的形式

  • ENTRYPOINT- 容器进入时执行的命令

开机自启动:ENTRYPOINT和CMD都是让用户指定一个可执行程序, 这个可执行程序在container启动后自动启动.

CMD 作用是指定具体的参数

  • shell 格式:CMD <命令>,shell 格式的话,实际的命令会被包装为 sh -c 的参数的形式进行执行,docker用/bin/sh -c的语法调用.
  • exec 格式:CMD [“可执行文件”, “参数1”, “参数2”…],表示法后面用了类似于JSON的语法表示要执行的命令. 这种用法告诉docker不需要调用/bin/sh执行命令
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

# 例如
FROM ubuntu:trusty
CMD ping localhost # 相当于实际运行的命令是 /bin/sh -c 'ping localhost'.
CMD ["/bin/ping","localhost"] 
# 例如
CMD ["/bin/echo", "this is a echo test"]
# 运行镜像
docker run test  # docker run命令如果指定了参数会把CMD里的参数覆盖,如docker run -it ubuntu /bin/bash 
# 输出
this is a echo test

ENTRYPOINT入口点

用于设定容器启动时第一个运行的命令及其参数,任何使用docker run <image>命令传入的参数都会附加在entrypoint指令之后

  • ENTRYPOINT指定默认的运行命令, CMD指定默认的运行参数. ENTRYPOINT和CMD同时存在时, docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最终执行的命令
FROM ubuntu:trusty
ENTRYPOINT ["/bin/ping","-c","3"]
CMD ["localhost"] 
# 相当于  /bin/ping -c 3 localhost,用shell命令行发送ping请求3次

ENTRYPOINT [ "sh", "-c", "echo $HOME" ] # 相当于 sh -c echo $HOME,即用shell命令行 执行echo $HOME命令

另外一种形式是使用一个脚本作为ENTRYPOINT的值。按照惯例来说,脚本名中通常包含entrypoint关键字。在这个脚本中,你可以做相关的配置,设置环境变量等,例如下面代码:

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["postgres"]

例如,下面就是Postgres官方镜像中的ENTRYPOINT脚本中的内容:

#!/bin/bash
set -e
if [ "$1" = 'postgres' ]; then
    chown -R postgres "$PGDATA"
    if [ -z "$(ls -A "$PGDATA")" ]; then
        gosu postgres initdb
    fi
    exec gosu postgres "$@"
fi
exec "$@"

3 实战开发

将本机内容复制到docker 容器中 docker cp 源地址 容器名称:目标地址

docker cp  D:\cts\cts-0825 59082bc9f284fe4b1309e3bd617b65c5506c6446f8098b317114f9e11b0a3f9b:/app/

查看已有端口 docker image

docker run -it -p 8080:8080  yushl/tomcat  /bin/bash	 # 指定本机端口映射容器端口

docker run -it -p 127.0.0.1:5100:5100 -p 127.0.0.1:5102:5102  ubuntu  # 指定本机ip:端口映射

查看正在运行的容器:docker ps

查看容器的端口映射信息:docker port 容器名称

每次启动新的ubuntu容器,原先下载的东西都会没有

# 增加新的用户
adduser sommer
# 修改用户的sudo 权限

vim /etc/sudoers
# 在/etc/sudoers文件中找到root	ALL=(ALL:ALL) ALL,在该行下面添加:
sommer	ALL=(ALL:ALL) ALL

# 包括但不限于以下update方法
sudo apt-get update
sudo apt-get upgrade
sudo apt update

# 下载安装 vim sudo
apt-get update
apt-get install vim
apt-get install sudo

4 Docker 命令大全

容器生命周期管理

  • run
  • start/stop/restart
  • kill
  • rm
  • pause/unpause
  • create
  • exec

容器操作

  • ps
  • inspect
  • top
  • attach
  • events
  • logs
  • wait
  • export
  • port
  • stats

容器rootfs命令

  • commit
  • cp
  • diff

镜像仓库

  • login
  • pull
  • push
  • search

本地镜像管理

  • images
  • rmi
  • tag
  • build
  • history
  • save
  • load
  • import

info|version

  • info
  • version

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/172961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于CIS移植的一些基本概念

1. 摄像头sensor 的原理 定时脉冲生成器会生成clock&#xff0c;用于访问image sensor 阵列中的行&#xff0c;预充电&#xff0c;并且按顺序采样像素阵列中的所有行。在一个行的预充电和采样的时间段里&#xff0c;像素的电荷量会随着曝光时间而逐渐减少。这就是快门结构中的曝…

Python采集周边烤肉店数据,康康哪一家最好吃?

人生苦短&#xff0c;我用Python 这不是天气开始突然大范围降温了吗&#xff1f; 降温就要吃烤肉啊 滋辣滋辣的声音特别好听&#xff5e; 放假吃烤肉真的特别快乐~ 天冷了&#xff0c;逛街…… 天冷了&#xff0c;吃烤肉…… 天冷了&#xff0c;喝奶茶…… 有温度的冬天&a…

p83出现的问题(空指针异常)原因及解决方案

我的GitHub&#xff1a;Powerveil GitHub我的Gitee&#xff1a;Powercs12 (powercs12) - Gitee.com皮卡丘每天学Java相关知识&#xff1a;Mybatis Plus、Spring Security本质原因&#xff1a;我们自己将Article字段的update字段做了自动填充导致自动填充时无法获取当前用户(程…

pytorch Conv2d令人迷惑的几个参数

本篇仅用来记录nn.Conv2d()中容易令人不解的几个参数 1. nn.Conv2d() 的输出维度的计算 相信大家都看过官网给出的计算方式: 直接套公式即可, 但需要注意的是, 最终计算的结果要向下取整. 2. dilation 官方解释为: dilation (int or tuple, optional) – Spacing between k…

贪心 455. 分发饼干

455. 分发饼干 难度简单636 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&…

为什么STM32设置Flash地址0x08000000而不是0x00000000?STM32的启动过程

STM32F103ZE芯片存储空间的地址映射关系图。 在MDK编译程序设置ROM和RAM地址时候发现&#xff1a;    IROM1为片上程序存储器&#xff0c;即片上集成的Flash存储器&#xff0c;对该处理器Flash大小为512KB&#xff0c;即0x80000 地址区间为0x8000000~0x0807FFFF  IRAM1为片…

day10文件知识点

模态对话框ajax后台ModelForm校验 目录切换&#xff1a;展示当前文件夹和文件 删除文件夹&#xff1a;嵌套的子文件和子文件夹全部删除 js上传文件到cos&#xff08;wiki用python上cos上传文件&#xff09; 进度条的操作&#xff08;bootstrap&#xff09;实现 删除文件&#x…

【Linux详解】——进程地址空间

&#x1f4d6; 前言&#xff1a;本节将以新的视角看的地址空间的特点&#xff0c;与以前对指针的认识做区分。 目录&#x1f552; 1. C/C 地址空间回顾&#x1f552; 2. 进程地址空间&#x1f558; 2.1 感性理解概念&#x1f558; 2.2 如何“画饼”&#x1f558; 2.3 区域划分&…

SQL面试题

有3个表S(学生表)&#xff0c;C&#xff08;课程表&#xff09;&#xff0c;SC&#xff08;学生选课表&#xff09; S&#xff08;SNO&#xff0c;SNAME&#xff09;代表&#xff08;学号&#xff0c;姓名&#xff09; C&#xff08;CNO&#xff0c;CNAME&#xff0c;CTEACHER&…

SAP FICO 定义成本组件结构

成本组件结构定义 我们在使用CK11N核算物料标准成本时候可以看到有项目明细&#xff0c;也可以看到有成本构成&#xff0c;那么问题来了&#xff0c;怎么将项目明细分类到各个成本构成上面呢&#xff1f; 【后台配置路径】&#xff1a; SPRO→控制→产品成本控制→产品成本计划…

【云原生】k8s之包管理器Helm

内容预知 前言 1.Helm的相关知识 1.1 Helm的简介与了解 1.2 Helm的三个重要概念 1.3 Helm2与Helm3的的区别 &#xff08;1&#xff09;helm2的部署方式与使用 &#xff08;2&#xff09;Helm3的部署与使用 2.Helm在k8s集群中的部署 &#xff08;1&#xff09;将Helm安…

【docker概念和实践 3】 注册阿里云账号、应用阿里云数据源

一、说明 阿里云是什么&#xff1f;是出租、出售运算资源的平台。几乎囊括各个领域的运算、存储、服务器、云端资源。阿里云的明星产品四大件是&#xff1a;1、即云服务器ECS、2、云数据库RDS、3、负载均衡SLB 4对象存储OSS。 其它多种服务&#xff1a;云小站_专享特惠_云产品推…

OpenSceneGraph图形状态管理内幕

在这个教程中&#xff0c;我们将了解 Open Scene Graph 如何表示 OpenGL 图形状态&#xff0c;并探索 Open Scene Graph 优化渲染以最小化状态更改次数的一些方法。 推荐&#xff1a;用 3D场景编辑器快速搭建数字孪生场景。 1、OpenGL状态机 Open Scene Graph 最重要的优化之一…

Android的linux内核解耦

1、boot内容查看Boot Image Header&#xff0c;version 2版本包含内容最多&#xff0c;包括了内核、设备树、根目录、recovery设备树&#xff0c;cmdline。boot拆包与内容解析参考1、Android bootimg kernel&#xff08;boot.img&#xff09;2、linux的ramdisk解耦2.1、ramdisk…

Python学习笔记——文件操作

输入和输出Python两种输出值的方式: 表达式语句和 print() 函数。第三种方式是使用文件对象的 write() 方法&#xff0c;标准输出文件可以用 sys.stdout 引用。如果你希望输出的形式更加多样&#xff0c;可以使用 str.format() 函数来格式化输出值。如果你希望将输出的值转成字…

H3C路由器带宽保证(命令行)配置方法

1 配置需求或说明 1.1适用产品系列 本案例适用于如MSR810、MSR93X系列的路由器。 1.2配置需求及实现的效果 某企业路由器接入业务有语音业务、管理部门业务和普通业务。要求当网络出现拥塞时&#xff0c;语音业务加速转发&#xff0c;管理部门业务确保转发&#xff0c;剩余或…

小满OKKICRM与金蝶云星空对接集成客户档案

小满OKKICRM与金蝶云星空对接集成客户列表查询(更新列表)&客户新增(小满客户对接金蝶客户-P)数据源平台:小满OKKICRM小满科技成立于2013年&#xff0c;是阿里巴巴集团战略投资的高新技术企业。小满科技以“人工智能大数据”为核心驱动力&#xff0c;为外贸企业提供智能CRM解…

合并所有重叠的区间

Python-合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 示例 1: 输入&#xff1a;interva…

【Ajax】模板引擎

一、模板引擎的基本概念渲染UI结构时遇到的问题var rows [] //遍历空数组 $.each(res.data, function (i, item) { // 循环拼接字符串rows.push(<li class"list-group-item"> item.content <span class"badge cmt-date">评论时间&#xff1a;…

87.序列到序列学习(seq2seq)以及代码实现

1. 机器翻译 2. Seq2Seq 双向RNN可以做encoder&#xff0c;但不能做decoder。 3. 编码器-解码器细节 4. 训练 5. 衡量生成序列的好坏的BLEU 上面的公式既加入了段序列的惩罚项&#xff0c;又加入了更难出现的长序列的高权重。 6. 总结&#xff1a; Seq2seq从一个句子生成另一…