Docker快速上手及常用命令速查

news/2024/5/19 0:27:59/文章来源:https://blog.csdn.net/dengruijin/article/details/137610424

Docker快速上手

安装

在ubuntu上安装docker:

sudo apt-get install docker
docker -v #查看版本

在centos7上安装docker:(docker在YUM源的Extras仓库中)

yum install docker
systemctl start docker

docker常用命令速查

#查看docker信息
docker info
#查看本地镜像列表
docker images
docker rmi <IMAGE> #删除指定的本地镜像#只创建不启动容器
docker create --name mycntainer  docker/getting-started
#启动处于停止状态的容器
docker start <CONTAINER_ID>
#创建并启动容器 -d表示在后台运行,终端不会停留在容器的输出界面。(冒号前是主机端口)
docker run -d -p 80:80 docker/getting-started
docker run -itd centos:7 bash
#用多个-p可以映射多个端口:
docker run -d -p 80:80 -p 88:8088 docker/getting-started
#指定entrypoint:
docker run -it --entrypoint=bash centos:7
#指定环境变量:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7
#连接到运行中的容器的终端(attach连接后,退出终端时容器也会退出,exec方式则不会)
docker attach <CONTAINER_ID>
docker exec -it <CONTAINER_ID> bashdocker ps #查看当前运行的容器
docker ps -a #查看当前所有容器,包括运行的和没有运行的
docker stop <CONTAINER ID> # 停止指定的容器
docker rm <CONTAINER ID> # 删除容器 加-f可删除运行中的容器
docker logs <CONTAINER ID> # 查看容器的控制台日志
docker inspect <CONTAINER OR IMAGE> #查看容器或镜像信息
docker cp xx <CONTAINER ID>:/xxx/xx #复制文件或目录到容器中(容器可以不运行)
docker cp <CONTAINER ID>:/xxx/xxx ./  #从容器复制文件或目录 (容器可以不运行)
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]] #提交容器内的修改形成新的镜像
# 查看或修改已停止容器中的文件,方法一:创建新的镜像,使用新镜像运行容器再修改
docker commit <CONTAINER_ID> test_image
docker run -ti --entrypoint=bash  test_image
# 查看或修改已停止容器中的文件,方法二:直接修改
直接修改/var/lib/docker/overlay2目录下的文件# 将镜像导出为文件,例如:
docker save busybox > busybox.tar
docker save myimage:latest | gzip > myimage_latest.tar.gz
docker save -o fedora-latest.tar fedora:latest
# 从文件导入镜像:
docker load < busybox.tar.gz
docker load --input fedora.tar# docker compose
#批量启动(-d选项表示后台运行,日志不在控制台输出)
docker compose -f XXXX.yml up -d  
#批量停止
docker compose -f XXXX.yml stop
#批量删除
docker compose -f XXXX.yml rm

运行第一个容器

docker run -d -p 80:80 docker/getting-started
# -d表示该容器在后台运行
# -p表示将主机的指定端口映射到容器内(冒号前是主机端口),这样用主机IP和端口就能访问容器内的服务。

该命令会首先在本地找docker/getting-started镜像,本地没有则自动从dockerhub上下载到本地。

运行完成后用docker ps可以看到用docker/getting-started镜像启动的容器,该容器开放80端口,可在浏览器访问:
在这里插入图片描述
在这里插入图片描述

从dockerhub查找镜像

可以访问https://hub.docker.com/来查找镜像;

也可以通过命令行查找和下载镜像:

docker search centos #查找docker上的centos镜像
docker pull centos  #最新的centos镜像,目前是centos8
docker pull centos:7 #下载tag(版本)为7的centos镜像

怎么查看某个镜像有哪些tag?目前没找到命令行方式,只能通过访问dockerhub去看。

制作第一个镜像

docker镜像是分层的,我们可以基于一个基础镜像,加上我们需要的东西形成自己的新镜像。

比如,现在我们有一个nodejs写的demo程序,想分享给其他人,如果直接只是分享源码或可执行文件,其他人还得搭建依赖环境才能运行起来,我们可以把环境和程序都打包成docker镜像,这样只要用这个镜像来启动容器就能够运行这个demo了。下面是镜像制作过程:

git clone https://github.com/docker/getting-started.git #获取源码到主机上(源码在getting-started/app目录)
# 源码结构:
dengrj@dengrjdev:~/docker$ ll getting-started/app/
total 192
drwxrwxr-x 4 dengrj dengrj   4096 522 11:38 ./
drwxrwxr-x 6 dengrj dengrj   4096 522 11:38 ../
-rw-rw-r-- 1 dengrj dengrj    646 522 11:38 package.json
drwxrwxr-x 4 dengrj dengrj   4096 522 11:38 spec/
drwxrwxr-x 5 dengrj dengrj   4096 522 11:38 src/
-rw-rw-r-- 1 dengrj dengrj 174891 522 11:38 yarn.lock

在app目录下创建Dockerfile文件,内容如下:

# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000

创建好Dockerfile后,在app目录下执行命令来构建镜像:

docker build -t getting-started .

使用该镜像来启动容器:

docker run -dp 3000:3000 getting-started

如果代码修改了,我们需要重新构建镜像,再用新镜像来启动容器

数据持久化

数据如果存放在容器中,如果该容器删除了,数据就删除了,为了使数据和容器分离,通常会给容器挂载存储卷(Volume),docker支持两种存储卷:

  • named volume:需先创建卷再挂载,支持驱动插件来挂网络存储(SFTP、Ceph、NFS等),只能指定容器端挂载点;
  • bind mounts:可指定主机端和容器端挂载点,无需创建卷,不支持驱动插件

named volume

创建卷:

docker volume create todo-db #todo-db是卷的名称

将卷挂载至容器:

# /etc/todos是容器内的挂载点,容器内程序向/etc/todos写文件就会存在主机的todo-db卷中
docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started 

bind mounts

无需创建卷,直接通过挂载将主机目录和容器内的目录建立映射关系:

# /etc/todos是容器内的挂载点,/data/app是主机中的挂载点
docker run -dp 3000:3000 -v /data/app:/etc/todos getting-started 

容器网络连接

默认情况下,主机上的容器是相互隔离的,他们互相不知道对方的存在,那么如果两个容器之间需要能够进行网络通信,怎么实现?

在docker中,我们可以创建一个网络,那么在该网络内的所有容器都可以互相通信。

#创建一个名称为todo-net的网络
docker network create todo-net 
#创建容器时指定网络,--network-alias mysql为该容器起了一个网络别名,
#	todo-net网络中的其他容器可以通过mysql来访问mysql的容器,类似于DNS的主机名
docker run -d \--network todo-net --network-alias mysql \-v todo-mysql-data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=secret \-e MYSQL_DATABASE=todos \mysql:5.7

Dockerfile指令

docker在构建镜像时按步骤执行Dockerfile中的指令,每条指令执行完都会形成一层文件系统提交到新的镜像中,就像git中的commit一样。

FROM

Dockerfile必须以FROM指令开头,表示使用哪个父镜像来作为构建的基础。FROM支持三种格式:

FROM [--platform=<platform>] <image> [AS <name>]
FROM [--platform=<platform>] <image>[:<tag>] [AS <name>]
FROM [--platform=<platform>] <image>[@<digest>] [AS <name>]

ENV

ENV指令用于定义容器运行时的环境变量,不过ENV定义的环境变量也是可以在Dockerfile中通过$variable_name${variable_name}符来引用,${}用于变量和其他参数之间没有空格的情况,例如:${foo}_bar.

${variable:-word}表示:variable已定义则使用定义的值,未定义则使用word;

${variable:+word}表示:variable已定义则使用word,未定义则使用空字符串;

FROM busybox
ENV FOO=/bar
WORKDIR ${FOO}   # WORKDIR /bar
ADD . $FOO       # ADD . /bar
COPY \$FOO /quux # COPY $FOO /quux

注意:在一条指令中,环境变量的代入使用的值只有一个:下面的例子中,def的值会是hello而不是byeghi的值则会是bye

ENV abc=hello
ENV abc=bye def=$abc
ENV ghi=$abc

一行可以设置多个变量:

ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \MY_CAT=fluffy

对于只在镜像构建阶段用到的环境变量,不建议使用ENV指令,而可以直接写在指令的参数中,或使用ARG指令,例如:

RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y ...
# 或
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y ...

ADD

将构建上下文的文件、目录或从URL获取文件添加到镜像的<dest>路径中。语法格式:

# --chown只对linux平台有效,路径中有空格时用双引号
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

如果<src>为相对路径,相对的是构建上下文,如果<dest>是相对路径,相对的是容器内的WORKDIR

添加的所有的文件和目录,UID和GID都会设为0,除非使用--chown做了指定。

COPY

将构建上下文的文件、目录添加到镜像的<dest>路径中。语法格式:

# --chown只对linux平台有效,路径中有空格时用双引号
COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

RUN

RUN用于在构建镜像时执行命令,支持两种格式

RUN <command> # 命令将在shell中执行
RUN ["executable", "param1", "param2"] # 通过exec调用,这里参数是以JSON array来解析的,所以里面带双引号

CMD

CMD用于指定容器启动时默认执行的程序(用户在docker run参数中指定的程序可覆盖CMD指定的程序),一个Dockerfile中只能有一个CMD指令生效,若有多个则最后一个生效。

CMD指令支持三种格式:

CMD ["executable","param1","param2"] #(官方推荐),通过exec调用,这里参数是以JSON array来解析的,所以里面带双引号
CMD ["param1","param2"] #作为ENTRYPOINT指令的默认参数
CMD command param1 param2 # 通过shell调用

CMD指令和ENTRYPOINT的区别:

ENTRYPOINT指令也可指定容器启动时要执行的命令,并且的ENTRYPOINT优先级最高。CMD和ENTRYPOINT同时出现时,CMD中的参数会被附加到ENTRYPOINT 指令的后面作为参数。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。

EXPOSE

告诉Docker这个容器要监听的端口,还可指定使用的协议是tcp还是udp,或者tcp和udp都使用,不指定则默认为tcp。

注意:EXPOSE并不实际暴露接口,它的作用更像是用户手册,只是告诉用户要暴露什么端口,实际暴露的端口是由docker run的-p或-P参数指定的,可以和EXPOSE指定的不一样。

EXPOSE <port> [<port>/<protocol>...]
#监听tcp 80端口
EXPOSE 80/tcp 
#监听udp 81端口
EXPOSE 81/udp 
# 监听tcp和udp的82端口,则写两条EXPOSE指令
EXPOSE 82/tcp 
EXPOSE 82/udp 

ENTRYPOINT

用于指定容器启动时的入口程序,格式如下:

ENTRYPOINT ["executable", "param1", "param2"] # 通过exec执行,以JSON array解析,所有带双引号
ENTRYPOINT command param1 param2 # 通过shell来执行

ENTRYPOINT指令也可指定容器启动时要执行的命令,并且的ENTRYPOINT优先级最高。CMD和ENTRYPOINT同时出现时,CMD中的参数会被附加到ENTRYPOINT 指令的后面作为参数。 如果这时docker run命令带了参数,这个参数会覆盖掉CMD指令的参数,并也会附加到ENTRYPOINT 指令的后面。
在这里插入图片描述

VOLUME

VOLUME指令用于指定一个挂载点,容器启动时,该挂载点中的文件会被自动复制到挂载的卷中。

VOLUME ["/data"]
VOLUME /var/log /var/db

USER

用于指定RUNCMDENTRYPOINT指令执行时所用的用户身份。

USER <user>[:<group>]
USER <UID>[:<GID>]

WORKDIR

用于设置RUN, CMD, ENTRYPOINT, COPYADD指令的工作目录(镜像内的),若工作目录不存在则会自动创建。

WORKDIR /path/to/workdir

WORKDIR在一个dockerfile中可以多次出现,如果使用相对路径,则表示相对前一个工作目录。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd  # 输出/a/b/c

WORKDIR可以引用ENV定义的环境变量,如果引用未定义的变量,则原样输出,例如:

ENV DIRPATH=/path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd # 输出/path/$DIRNAME

如果没有设置WORKDIR则使用父镜像设置的工作目录,如果父镜像也没有设置,则使用/作为工作目录。为避免工作目录不清晰,建议在dockerfile中显式指定WORKDIR

ARG

用于定义构建时使用的参数变量:

ARG <name>[=<default value>]

构建镜像时可传参指定变量值:

docker build --build-arg <varname>=<value>

ARG指令的作用域自定义所在行开始,到该stage结束,若要在多个stage中使用变量,那要在各个stage都定义:

FROM busybox
ARG SETTINGS
RUN ./run/setup $SETTINGSFROM busybox
ARG SETTINGS
RUN ./run/other $SETTINGS
预定义的变量

Docker包含以下预定义的变量,这些变量无需在dockerfile使用ARG指令定义就可以使用

  • HTTP_PROXY
  • http_proxy
  • HTTPS_PROXY
  • https_proxy
  • FTP_PROXY
  • ftp_proxy
  • NO_PROXY
  • no_proxy

ONBUILD

用于指定一个指令,在本镜像作为父镜像时触发,也就是在下游镜像Dockerfile的FROM指令执行时触发

ONBUILD <INSTRUCTION>

STOPSIGNAL

停止容器时给容器发什么信号,默认是SIGTERM

STOPSIGNAL signal
#例如:
STOPSIGNAL SIGKILL
STOPSIGNAL 9

HEALTHCHECK

指定用于检测容器健康状态的命令

HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE  # 不开启健康检测
#例如:
HEALTHCHECK --interval=5m --timeout=3s \CMD curl -f http://localhost/ || exit 1

SHELL

SHELL ["executable", "parameters"]

用于指定执行shell命令的默认shell,如果不指定,在Linux下默认值为:["/bin/sh", "-c"]

镜像分享

在线分享

注册DockerHub账号,登录DockerHub创建仓库(Repository):
在这里插入图片描述

我本地有一个drjdemo的镜像:
在这里插入图片描述

如何push到dockerhub上的dengruijin/demo仓库:

# 先将镜像名称修改为和dockerhub一致
docker tag drjdemo dengruijin/demo
# push前要先登录:(dengruijin是dockerhub登录名)
docker login -u dengruijin
# 下面就可以push了
docker push dengruijin/demo

离线分享

  • 将镜像导出为文件

可以使用docker save将镜像保存为一个tar包:

docker save [OPTIONS] IMAGE [IMAGE...]

例如:

docker save busybox > busybox.tar
docker save myimage:latest | gzip > myimage_latest.tar.gz
docker save -o fedora-latest.tar fedora:latest
  • 导入镜像:
docker load [OPTIONS]

例如:

docker load < busybox.tar.gz
docker load --input fedora.tar

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot及其特性

0.前言 Spring 框架提供了很多现成的功能。那么什么是 Spring Boot&#xff1f;使用 Spring 框架&#xff0c;我们可以避免编写基础框架并快速开发应用程序。为了让 Spring 框架提供基础框架&#xff0c;我们需要向 Spring 框架描述有关我们的应用程序及其组件的信息。 不只是…

面试记录(三)

面了57min&#xff0c;实在问麻了&#xff0c;下面的问题就没有按顺序记录了&#xff1a; 1.linux熟悉吗&#xff1a;熟悉基础的环境变量、目录等用法&#xff0c;问如何查找一个文件&#xff08;不会&#xff0c;又追问如何设计一个c的程序去查找&#xff1a;先找文件类型&am…

java基础语法(12)| 异常

1. 异常 1.1 什么是异常 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象或抛出了一个异常对象。Java处理异…

万界星空科技生产工时管理系统

生产工时管理系统是一个管理系统&#xff0c;生产管理人员可以详细地、逐项活动地查看生产和即时劳动力数据&#xff0c;特别是活动级劳动力信息&#xff0c;辅助生产管理人员利用从车间获得的效率数据&#xff0c;实时监控生产流程&#xff0c;并在提高生产率&#xff0c;控制…

C++的并发世界(十一)——线程池

0.线程池的概念 1.线程池使用步骤 ①初始化线程池&#xff1a;确定线程数量&#xff0c;并做好互斥访问&#xff1b; ②启动所有线程 ③准备好任务处理基类&#xff1b; ④获取任务接口&#xff1a;通过条件变量阻塞等待任务 2.atomic原子操作 std:atomic是C11标准库中的一个…

ics-05-攻防世界

题目 点了半天只有设备维护中心能进去 御剑扫一下 找到一个css 没什么用 再点击云平台设备维护中心url发生了变化 设备维护中心http://61.147.171.105:65103/index.php?pageindex试一下php伪协议 php://filter/readconvert.base64-encode/resourceindex.php base64解一下…

Vue2电商前台项目(三):完成Search搜索模块业务

目录 一、请求数据并展示 1.写Search模块的接口 2.写Vuex中的search仓库&#xff08;三连环&#xff09; 3.组件拿到search仓库的数据 用getters简化仓库中的数据 4.渲染商品数据到页面 5.search模块根据不同的参数获取数据展示 &#xff08;1&#xff09;把派发actions…

HTML5.Canvas简介

1. Canvas.getContext getContext(“2d”)是Canvas元素的方法&#xff0c;用于获取一个用于绘制2D图形的绘图上下文对象。在给定的代码中&#xff0c;首先通过getElementById方法获取id为"myCanvas"的Canvas元素&#xff0c;然后使用getContext(“2d”)方法获取该Ca…

MySQL学习笔记(数据类型, DDL, DML, DQL, DCL)

Learning note 1、前言2、数据类型2.1、数值类型2.2、字符串类型2.3、日期类型 3、DDL总览数据库/表切换数据库查看表内容创建数据库/表删除数据库/表添加字段删除字段表的重命名修改字段名&#xff08;以及对应的数据类型&#xff09; 4、DML往字段里写入具体内容修改字段内容…

【Java网络编程】OSI七层网络模型与TCP/IP协议簇

1.1、OSI七层网络模型 OSI七层网络模型中&#xff0c;每层的功能如下&#xff1a; 应用层&#xff1a;人与计算机网络交互的窗口。表示层&#xff1a;负责数据格式的封装&#xff0c;如加密、压缩、编解码等。会话层&#xff1a;建立、终止、管理不同端间的会话连接。传输层&a…

【linux】基础IO(四)

在上一篇基础IO中我们主要讲述了文件再磁盘中的存储&#xff0c;当然我们说的也都只是预备知识&#xff0c;为这一篇的文件系统进行铺垫。 目录 搭文件系统的架子&#xff1a;填补细节&#xff1a;inode&#xff1a;datablock[]: 更上层的理解&#xff1a; 搭文件系统的架子&a…

PTA 探索地道战

地道战是在抗日战争时期&#xff0c;在华北平原上抗日军民利用地道打击日本侵略者的作战方式。地道网是房连房、街连街、村连村的地下工事&#xff0c;如下图所示。 我们在回顾前辈们艰苦卓绝的战争生活的同时&#xff0c;真心钦佩他们的聪明才智。在现在和平发展的年代&#x…

软考113-上午题-【计算机网络】-IPv6、无线网络、Windows命令

一、IPv6 IPv6 具有长达 128 位的地址空间&#xff0c;可以彻底解决 IPv4 地址不足的问题。由于 IPv4 地址是32 位二进制&#xff0c;所能表示的IP 地址个数为 2^32 4 294 967 29640 亿&#xff0c;因而在因特网上约有 40亿个P 地址。 由 32 位的IPv4 升级至 128 位的IPv6&am…

Vue学习笔记-S1

1 什么是Vue Vue是一款用于构建用户界面的渐进式JavaScripte框架&#xff0c;可基于数据渲染用户页面. 1.1 Vue的知识架构 Vue核心包&#xff1a;声明式渲染、组件系统Vue构建&#xff1a;客户端路由、状态管理、构建工具局部使用Vue&#xff1a;快速入门、常用指令、生命周…

计算机组成结构—外部存储器

目录 一、磁盘存储器 1. 磁表面存储器和磁记录原理 2. 硬磁盘的分类和基本结构 &#xff08;1&#xff09;硬磁盘存储器的分类 &#xff08;2&#xff09;硬磁盘存储器的组成 3. 磁盘的工作原理 &#xff08;1&#xff09;磁盘存储区域 &#xff08;2&#xff09;磁盘地…

学习记录15-运算放大器例题1

一、例题1 图中自己加的一些声明&#xff0c;方便待会讲解&#xff08;请忽略丑。。。&#xff09; 根据虚短原则&#xff1a;U U- U 3V*(R4/(R3R4)) 3V*&#xff08;20 / (1020)) 2V U- U- -1V*(R2/(R1R2))Uo*(R1/(R1R2)) -1V*(20/30)Uo*(10/30) -2/3VUo*1/3 …

java算法day50 | ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 思路&#xff1a; 这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。代码随想录讲解视频 class Solution {public int maxProfit(int[] prices) {int[][] dpnew int[prices.length][5];dp[0][0]0;dp[0][1]-prices…

Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析

目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点&#xff1a; 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…

接口自动化测试(python+pytest+requests)

一、选取自动化测试用例 优先级高:先实现业务流程用例、后实现单接口用例功能较稳定的接口优先开展测试用例脚本的实现二、搭建自动化测试环境 核心技术:编程语言:python;测试框架:pytest;接口请求:requests安装/验证requests:命令行终端分别输入 pip install requests / p…

无线游戏手柄的测试(Windows11系统手柄调试方法)

实物 1、把游戏手柄的无线接收器插入到电脑usb接口中 2、【控制面板】----【查看设备和打印机】 3、【蓝牙和其它设备】--【更多设备和打印机设置】 4、鼠标右键【游戏控制器设置】 5、【属性】 </