百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

docker基础知识/尚硅谷docker学习笔记

csdh11 2025-02-27 14:48 22 浏览

最近看了好多docker的资料,找了一些尚硅谷docker的教学视频,大概总结了一下前前后后的学习笔记。分享给大家。

安装

Docker的基本组成

镜像

Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。

容器

Docker 利用容器(Container)独立运行的一个或一组应用。容器是用镜像创建的运行实例。

它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。

可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。

容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

仓库

仓库(Repository)是集中存放镜像文件的场所。

仓库(Repository)和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。

最大的公开仓库是 Docker Hub(https://hub.docker.com/),

存放了数量庞大的镜像供用户下载。包括国内的公开仓库包括阿里云 、网易云 等

总结

需要正确地理解仓储/镜像/容器这几个概念:

Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就似乎 image镜像文件。只有通过这个镜像文件才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。

* image 文件生成的容器实例,本身也是一个文件,称为镜像文件。

* 一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器

* 至于仓储,就是放了一堆镜像的地方,我们可以把镜像发布到仓储中,需要的时候从仓储中拉下来就可以了。

安装步骤

centos6和7 过程不太一样

我本地有docker,所以该章节没有验证过

以centos7为例

1、虚拟机上网。。。

2、yum安装gcc,

yum -y install gcc

yum -y install gcc-c++

3、卸载旧版本

yum -y remove docker docker-common docker-selinux docker-engine

新版本看官网卸载办法

4、安装需要的软件包:yum intall -y yum-utils device-mapper-persistent-data lvm2

5、设置stable镜像仓库:yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6、更新yum软件包索引:yum makecache fast

7、安装Docker CE,yum -y install docker-ce

8、启动docker,systemctl start docker && systemctl enable docker

9、测试:

docker version
docker run hello-world

10、配置镜像加速器:

mkdir -p /etc/docker
vim /etc/docker/daemon.json
systemctl daemon-reload
systemctl restart docker

11、卸载

systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker

命令

帮助命令

docker version
docker info
docker --help

镜像命令

docker images
docker search
docker search [某个镜像的名称]
docker search [options] 镜像名称
options:
--no-tranc:显示完整的镜像描述
-s:列出收藏数不小于指定值的镜像
--automated:只列出automated build类型的镜像
docker pull 镜像名称
docker rmi hello-world/

删除全部镜像:docker rmi -f $(docker images -qa)

容器命令

新建并启动容器:

docker run [options] IMAGE [command] [arg...]
options:
--name="容器新名称" 为容器指定一个名称
-d:后台运行容器,并返回容器ID,即启动守护式容器
-i:以交互模式运行容器,通常与-t同时使用
-P:随机端口映射
-p:指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip::containerPort
hostPORT:containerPort
containerPort

列出当前正在运行的容器:docker ps 【options】

options:

-a:列出当前正在运行的容器+历史上运行过的

-l:显示最近创建的容器

-n:显示最近n个创建的容器

-q:静默模式,只显示容器编号

--no-trunc:不截断输出

退出容器:

exit:容器停止退出

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

启动容器:docker start 容器ID或名称

重启容器:docker restart 容器ID或名称

停止容器:docker stop 容器ID或名称

强制停止容器:docker kill容器ID或名称

删除已停止的容器:

docker rm 容器ID

docker rm -f $(docker ps -a -q)

docker ps -a -q|xargs docker rm


重要:

启动守护式容器:docker run -d 容器名

#使用镜像centos:latest以后台模式启动一个容器

docker run -d centos

问题:然后docker ps -a 进行查看, 会发现容器已经退出

很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程.

容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。


这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如

service nginx start

但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,

这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.

所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行


查看容器日志:docker logs -f -t 容器ID/docker logs -f -t --tail n 容器ID

查看容器内运行的进程:docker top 容器ID

查看容器内部的细节:docker inspect 容器ID

进入正在运行的容器并以命令行交互:

docker exec -it 容器ID /bin/bash

重新进入:docker attach 容器ID

从容器内拷贝文件到主机上:docker cp 容器ID:容器内路径 目的主机路径




Docker镜像

UnionFS-联合文件系统

是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。


端口映射

docker run -it -p 8888:8080 tomcat:latest

-p:主机端口号:docker容器端口号

-P:随机端口号

docker commit

以当前运行的docker作为实例复制一个副本镜像

docker commit -a="作者" -m=“备注信息” 运行实例的容器ID 复制副本镜像名称:自定义版本

docker commit -a="swz" -m="tomcat with docs" bdc80ace28e0 swz/tomcat:1.2

docker容器的数据卷

概念

是什么:内存的数据保存到磁盘,容器关闭,数据保存到数据卷中;

干什么:数据持久化,容器之间的集成和持久化;容器到主机,主机到容器的数据共享

相当于容器的外置磁盘

数据卷

命令添加

1、docker run -it -v /宿主机绝对路径:/容器内路径 镜像名称

docker run -it -v /myDataVolume:/dataVolumeContainer centos //主机和容器内的目录都是自动创建的 -v有新建的功能

docker inspect 容器ID,可以看到挂载效果


容器内外修改文件都可以实现同步,容器停止运行,主机修改文件后,容器下次运行会加载修改结果

2、指定数据卷权限

docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos

Dokerfile添加

VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]

说明:

出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。

由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。


容器会自动在内部创建VOLUME指定的目录,因为不能指定主机目录,docker会自动创建主机对应的目录,通过docker inspect 容器ID,可以查看对应的目录

数据卷容器--volumes-from

docker run -it --name dc02 --volumes-from dc01 swz/centos

1、启动一个有数据卷的父容器

2、创建一个新的容器,制定数据卷来自的父容器

3、子容器和父容器之间实现数据卷共享

Dockerfile

概念

1、Dockerfile是构建Docker镜像的构建文件,是一系列命令和参数构成的脚本

2、三步骤:编写Dockerfile,docker build ... ,docker run ...

3、centos例子:centos8-Dockerfile

Dockerfile构建过程解析

基础知识

1、每条指令必须以大写字母开头,且后面要跟随至少一个参数

2、从上到下,顺序执行

3、#注解

4、每条指令都会创建一个新的镜像层,并对镜像层进行提交


执行流程

1、docker从基础镜像运行一个容器

2、执行一条制定对容器作出修改

3、执行类似docker commit 的操作提交一个新的镜像层

4、docker再基于刚提交的镜像运行一个新的容器

5、执行Dockerfile中的下一条执行,循环2-3-4步骤,直到所有指令都执行完成

总结

从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段,

* Dockerfile是软件的原材料

* Docker镜像是软件的交付品

* Docker容器则可以认为是软件的运行态。

Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。


1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;

2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;

3 Docker容器,容器是直接提供服务的。

Dockerfile指令

FROM

基础镜像,当前新景祥是基于哪个镜像的

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露的端口

WORKDIR

制定的创建容器后,默认登陆进来的工作目录,一个落脚点

ENV

用来构建镜像过程中设置环境变量

ENV MY_PATH /usr/mytest

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;

也可以在其它指令中直接使用这些环境变量,

比如:WORKDIR $MY_PATH

ADD

将宿主机目录下的文件拷贝进镜像,且ADD命令会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中,将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<目标路径>位置

COPY ser dest
COPY ["src","dest"]

VOLUME

容器数据卷,用户数据保存和持久化工作

CMD

指定一个容器启动时要运行的命令


Dockerfile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令

ENTRYPOINT的目的和CMD一样,都是指定容器启动程序及参数

ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

总结


案例

Base镜像(scratch)

Docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的

自定义镜像mycentos

1、现状:登录根目录,vim,ifconfig都不存在

编写Dockfile

FROM centos
MAINTAINER swz

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

docker build -t mycentos:1.3 .

docker run -it mycentos:1.3

docker history 镜像ID

CMD/ENTRYPOINT镜像案例

1、都是指定一个容器启动时要运行的命令

2、CMD:

I)Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run 之后的参数替换

II)docker run -it -p 8888:8080 tomcat 正常情况下会运行tomcat,看到日志;

docker run -it -p 8888:8080 tomcat ls -l 列出文件目录,tomcat不会运行

3、ENTRYPOINT:

I)docker run之后的参数会被当做参数传递给ENTRYPOINT,之后形成新的命令组合

II)Case:制作CMD版可以查询IP信息的容器


自定义镜像Tomcat9

1、mkdir -p /root/mydocker/mytomcat

2、将jdk和tomcat的安装压缩包拷贝进上一步的目录

3、编写Dockerfile

FROM centos
MAINTAINER swz
#把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下
COPY readme.txt /usr/local/cincontainer.txt
#把java与tomcat添加到容器中
ADD jdk-8u73-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-8.5.24.tar.gz /usr/local/
#安装vim编辑器
RUN yum -y install vim
#设置工作访问时候的WORKDIR路径,登录落脚点
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置java与tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_73
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-8.5.24
ENV CATALINA_BASE /usr/local/apache-tomcat-8.5.24
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动时运行tomcat
# ENTRYPOINT ["/usr/local/apache-tomcat-8.5.24/bin/startup.sh" ]
#CMD ["/usr/local/apache-tomcat-8.5.24/bin/catalina.sh","run"]
# CMD ["sh","/usr/local/apache-tomcat-8.5.24/bin/startup.sh"]
CMD /usr/local/apache-tomcat-8.5.24/bin/startup.sh && tail -F /usr/local/apache-tomcat-8.5.24/bin/logs/catalina.out

4、docker build -t swz/tomcat:1.3 .

5、docker run -d -p 9080:8080 --name swztomcat -v /root/mydocker/mytomcat/apps01:/usr/local/apache-tomcat-8.5.24/webapps/apps01 -v /root/mydocker/mytomcat/logs/:/usr/local/apache-tomcat-8.5.24/logs --privileged=true swz/tomcat:1.3

总结

Docker常用安装

总体步骤

搜索镜像

拉取镜像

查看镜像

启动镜像

停止容器

移除容器

安装tomcat

1、docker hub上查找tomcat镜像

docker search tomcat

2、从docker hub上拉取镜像到本地

docker pull tomcat

3、docker images查看是否拉取到想要的tomcat

4、使用tomcat镜像创建容器(运行镜像)

docker run -it -p 8080:8080 tomcat

安装mysql

1、docker hub上查看mysql镜像

2、从docker hub上拉取mysql镜像到本地标签为5.6

3、使用mysql5.6镜像创建容器

docker run -p 12345:3306 --name mysql -v /zzyyuse/mysql/conf:/etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs -v /zzyyuse/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6


命令说明:

-p 12345:3306:将主机的12345端口映射到docker容器的3306端口。

--name mysql:运行服务名字

-v
/zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d

-v /zzyyuse/mysql/logs:/logs:将主机/zzyyuse/mysql目录下的 logs 目录挂载到容器的 /logs。

-v
/zzyyuse/mysql/data:/var/lib/mysql :将主机/zzyyuse/mysql目录下的data目录挂载到容器的 /var/lib/mysql

-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

-d mysql:5.6 : 后台程序运行mysql5.6

docker run -p 3306:3306 --name mysql -v /root/mydocker/mysql/conf:/etc/mysql/conf.d -v /root/mydocker/mysql/logs:/logs -v /root/mydocker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6

4、mysql的数据库备份

docker exec myql服务容器ID sh -c ' exec mysqldump --all-databases -uroot -p"123456" ' > /zzyyuse/all-databases.sql

安装redis

1、从docker hub上拉取redis镜像到本地标签为3.2

2、使用镜像

3、在主机目录下新建redis.conf文件

4、docker run -p 6379:6379 -v /root/mydocker/redis/data:/data -v /root/mydocker/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes


安装NGINX

1、docker pull nginx:1.17

2、在相关目录下先创建nginx.conf文件,不然会报错

3、docker run -d -p 8082:80 --name nginx-test -v /root/mydocker/nginx/www:/usr/share/nginx/html -v /root/mydocker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/mydocker/nginx/logs:/var/log/nginx nginx:1.17

本地镜像发布到阿里云

本地镜像发布到阿里云流程

镜像的生成方法

1、先运行容器:docker run -it mycentos(镜像名称)

2、提交容器镜像:

docker commit -a swz -m "test centos 1.4 from 1.3 " 0344b515c925 swz/centos:1.4

将本地镜像推送到阿里云

将阿里云的镜像下载到本地

阿里云上创建镜像之后,官网上都有说明,不再补充

相关推荐

全能硬件大师AIDA64 v4.60 最新绿色版下载

IT之家(www.ithome.com):全能硬件大师AIDA64v4.60最新绿色版下载今天,国外FinalWire公司正式发布全能系统硬件大师AIDA64v4.60最新版。本次新版加入14款...

2023年4款Mac软件推荐,绝不失望(mac2020i3)

1.VDown-免费下载视频是最近mac上出现的免费的视频下载软件,支持超过900多个站点,虽然看上去支持的站点略少于Downie,但是熟悉的网站B站,Youku全部都有,国外的站点,只要有办法访问...

实验设计和数据分析必不可少的Design-expert,谁还不会用呢?

Design-Expert软件介绍...

关于视频格式的那些事儿(视频格式作用)

闲暇之余,相信很多人的选择就是看视频。电视剧、综艺、手机短视频,总有一款适合你。然而播放这些视频时,你是否注意到了文件名后各种各样的后缀名了呢?是否会好奇为什么会存在这么多视频格式?不同的格式是不是影...

机器人学习也要提速提质!智元机器人发布首个通用具身基座大模型

去年已实现量产近千台的人形机器人公司智元机器人再度对外宣布重磅消息。3月10日,该公司正式发布首个通用具身基座大模型,即智元启元大模型(GenieOperator-1)。“GO-1大模型借助人类和多...

软网推荐:硬盘管理用好Macrorit Partition Expert

平时我们经常需要对硬盘进行管理,比如为了释放空间,需要将隐藏分区删除并重建分区;出于隐私保护,需要彻底删除硬盘分区上的数据;硬盘出现坏道需要将其屏蔽等等。诸如此类的操作,现在借助免费且图形化操作的分区...

Design-Expert 12.0 安装教程(附安装包下载)

Design-Expert12.0软件介绍是一款由Stat-EaseInc开发的专用于执行实验设计(DOE)的软件。它提供比较测试、筛选、表征、优化、稳健的参数设计、混合物设计和组合设计等功能,并...

不用在PLC内编程,实现西门子与罗克韦尔(AB)PLC之间数据通讯

巨控NET400数据网关支持多种PLC之间、PLC与智能仪表之间多对多通讯,支持以太网,串口设备混合数据交换;无需PLC内编程开发,只需在智能网关的参数管理软件上配置数据的起始地址和数量即可,支持热插...

S7-1500PLC做OPC UA通信服务器(s7-1200 opc ua)

OPCUA概述OPCUA是一项开放标准,适用于从机器到机器间(M2M)的水平通信和从机器直到云端的垂直通信。该标准独立于供应商和平台,支持广泛的安全机制,并且可以与PROFINET共享同一工...

WINCC配置OPC UA服务器的步骤和故障解决

WINCC配置OPCUA服务器的步骤和故障解决本次配置实例的环境:在同一局域网内的两台计算机,均为windows7SP1系统一台计算机安装wincc7.4,并建立项目,项目在运行状态一台计算机安...

视频格式在线转换,五种超实用的视频格式转换工具!

视频内容无处不在,从教育课程到娱乐电影,从社交媒体分享到在线会议,视频已成为我们日常生活中不可或缺的一部分。然而,不同的设备和平台支持的视频格式各异,会导致视频文件在某些设备上无法播放。因此,掌握视频...

支持裸眼3D:长虹X1手机/全新CHIQ电视发布

IT之家讯10月16日消息国产传统家电品牌长虹此前也一直有智能手机产品,但关注度并不高。今天下午,长虹举行发布会,发布了两款以裸眼3D技术为卖点的产品,分别为长虹X1手机和全新CHIQ曲面电视。长...

h265和h264有什么区别(h265和h264有什么区别)

目前很多摄像机采用了H.265的编码标准,H.264编码的摄像机逐渐减少,为什么H.265会流行?H.264和H.265有何不同?一、什么是H.265...

中文白皮书:面向视频编解码器和图形引擎的前沿多媒体方案 WP497

该白皮书探讨了ZynqUltraScale+MPSoC的多媒体功能。MPSoC基于Zynq-7000SoC,包括一个可编程逻辑(PL)的桥接处理系统(PS),但它在ZynqUltr...

科达NVR家族换新装:推出首款通用型H.265+4K NVR

近期,科达推出业内首款通用型H.265+4KNVR——NVR1821,吹响NVR家族全面升级的号角。据了解,保持原有通用型产品“高性价比”定位的基础上,全新NVR1821系列增加了4路4K解码+1路...