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

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

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

最近看了好多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

将本地镜像推送到阿里云

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

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

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...