当前位置:首页 > 技术文章 > 正文内容

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

arlanguage3个月前 (01-31)技术文章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

将本地镜像推送到阿里云

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

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

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1904.html

标签: nginx 截断
分享给朋友:

“docker基础知识/尚硅谷docker学习笔记” 的相关文章

Nginx 问题以及对应的解决方案

1. Nginx 无法启动当 Nginx 无法启动时,通常是由于以下几个原因导致的:配置文件有误。可以通过运行 nginx -t 命令检查配置文件是否存在语法错误。端口被占用。可以通过运行 netstat -tlnp 命令查看当前系统中占用该端口的进程,并将其停止或更改端口。缺少权限。Nginx 可...

logstash+ES+kibana搭建日志收集分析系统

日志监控和分析在保障业务稳定运行时,起到了很重要的作用,不过一般情况下日志都分散在各个生产服务器,且开发人员无法登陆生产服务器,这时候就需要一个集中式的日志收集装置,对日志中的关键字进行监控,触发异常时进行报警,并且开发人员能够查看相关日志。logstash+elasticsearch+kibana...

如何让Nginx后端服务收到真实的客户IP?

背景开发有一个服务部署在阿里云上,依赖阿里云的CLB(传统型负载均衡)暴露服务,因特殊要求,CLB和后端服务之间需要通过自建Nginx做代理,拓扑图如下,应用拓扑操作客户端的请求经过了两层代理,这里CLB和Nginx都要做配置。1,配置CLBCLB的配置比较简单,在配置“监听”时,要附加“X-For...

为什么一条UPDATE语句有索引反而更慢

先来看看今天要讲的主人翁:UPDATE `i_msg_system` set `deliver`=1 where `uid`=10000 and `msg_group`=0 and `deliver`=0;涉事表结构:CREATE TABLE `i_msg_system` ( `id` int(...

Java基础教程:k8s快速入门 k8s jmeter

介绍容器化部署随着Docker技术的流行,对项目的容器化部署方式越来越流行,容器化部署的优点如下:可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署虽然容器化部署可以...

nginx-UrlRewrite 实现URL重写转发

URL重写在前后端分离的开发模式中,会遇到这样一个需求:前端通过特定路由前缀来访问后端接口,例如:http://localhost/api/getUser,这里 api 即是每一个前端 request 所多加的前缀。nginx 需要把http://localhost/api/getUser 转换成后...