Docker学习笔记

Docker简介

(容器:可以在内部安装各种依赖,一般用于部署应用程序,可以解决版本差异)

是一个快速交付应用,运行应用的技术。

docker:可以在内部安装各种依赖,一般用于部署应用程序,可以解决版本差异

systemctl start | stop | restart docker

镜像:镜像是一个特殊的环境,包含需要部署的应用,同时还包含了系统的指令和环境变量等。

搜索镜像:docker  search  [OPTIONS]  TERM
上传镜像:docker  push  [OPTIONS]  NAME[:TAG]
下载镜像:docker  pull  [OPTIONS]  NAME[:TAG]
提交镜像:docker  commit [OPTIONS]  CONTAINER  NAME[:TAG]
构建镜像:docker  build  [OPTIONS]  PATH
删除镜像:docker  rmi [OPTIONS]  IMAGE  [IMAGE...]
增加镜像标签:docker  tag  SOURCE_IMAGE[:TAG]  TARGET_IMAGE[:TAG]
查看所有镜像:docker  images  [OPTIONS]  [REPOSITORY[:TAG]]

容器:容器是一个由镜像运行之后形成的一个密闭的环境

启动/重启容器:docker start/restart CONTAINER
停止/强停容器:docker stop/ kill CONTAINER
删除容器:docker rm [OPTIONS] CONTAINER [CONTAINER...]
重命名容器:docker rename CONTAINER CONTAINER_NEW
进入容器:docker attach CONTAINER
执行容器命令:docker exec CONTAINER COMMAND
查看容器日志:docker logs [OPTIONS] CONTAINER
查看容器列表:docker ps [OPTIONS]

卷:卷就是一个目录,主要目的是挂载容器的目录,这样就能操作容器

dockerhub:是一个镜像仓库可以从中拉取镜像

docker两大功能:安装 部署

1.1.1.具备的功能:

1、可以将程序及其依赖、运行环境一起打包成一个镜像,并且可以迁移到任意linux系统下

2、运行时利用沙箱机制形成隔离容器,各个应用之间相互不干扰

3、启动、移除都可以通过一行命令完成,方便快捷。

1.1.2.为啥要应用docker?

1、依赖关系复杂,容易出现 兼容性问题

2、开发、测试、生产环境有差异

1.1.3.docker重点面试题

一、如何解决大型项目依赖关系复杂,不同组件的兼容性问题?

1、将应用的函数库 、依赖、配置与应用一起打包

2、将每个应用放到一个隔离容器去运行,避免相互干扰

docker把系统的函数库和依赖,单独收集起来,用容器去运行,容器内可以随意改变,直到当前应用合适为止,并且不会影响本地的函数库和依赖

二、docker如何解决不同系统环境的问题?

1、将用户程序与需要调用的系统函数库一起打包

2、docker运行不同的操作系统时,镜像中包含整个运行环境,直接基于打包的函数库,借助linux内核来运行。

三、docker与虚拟机的差别?

虚拟机是在操作系统中模拟硬件设备,然后运行另一个操作系统。

docker仅封装函数库,并没有模拟完整的操作系统

在这里插入图片描述

Docker架构

2.2.1.镜像和容器

镜像(Image):docker将应用程序及其所需的依赖、函数库、环境、配置文件等文件打包在一起。(默认只读)

容器(Container):镜像中的应用程序运行之后形成的及进程就是容器,docker会对容器做隔离,对外不可见。一切应用最终都是代码组成,都是硬盘中的一个个的字节形成 的文件,只有在运行时,才会加载到内存,形成进程

2.2.2.DockerHub

Docker是一个CS架构的程序,由亮部分组成:

​ 1、服务端:Docker守护进程,负责处理Docker指令,管理镜像,容器等。

​ 2、客户端:通过命令或RestAPI向Docker服务端发送指令,可以在本地或远程向服务器发送指令

在这里插入图片描述

3.3.1.Docker基本操作

3.1.镜像的名称组成

一般分两部分组成:[repository]:[tag],在没有指定tag时,默认是latest,代表最新版本的镜像

在这里插入图片描述

3.2.镜像命令
在这里插入图片描述

下载镜像

docker pull nginx:latest

将镜像向外输出成压缩文件(输出流):

docker save -o nginx.tar niginx:latest

将由镜像压缩成的文件还原:

docker load -i nginx.tar

往自己的线上本地仓库推送时,需要进行登录

docker login

登录完成后,往本地仓库推送时,需要标注标签(tag)

docker tag nginx:latest 本地仓库名:版本号

进行推送

docker push 本地仓库名:版本号
4.4.1.容器操作

4.1.容器相关命令

在这里插入图片描述

docker run:创建并运行一个容器,处于运行状态
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停恢复运行
docker stop:停止一个运行的容器
docker start:让停止的容器再次运行
docker rm:删除一个容器  (-f 强制删除)

运行镜像并能够进行外部访问

docker run --name 名称 -d -p 9090:80 nginx:latest
			自定义名称	-p 对外开放一个端口才能进行访问   镜像名

进入nginx,修改配置文件

4.2.1.使用命令 docker exec 进入容器

docker  exec  -it 容器名  bash

-it:给当前进入的容器创建一个便准输入,输出终端,允许我们与容器交互
bash:进入容器后执行的命令,是一个linux终端交互命令
exit:进行退出
5.5.1.数据卷(容器数据管理的文件夹)

5.1.什么是数据卷?

​ 数据卷是一个虚拟目录,指向宿主机文件系统中的某个目录

linux下创建一个文件夹,容器中也有一个文件夹,使他们相对应,能同步数据

5.2.基础语法:

docker volume

docker volume命令是数据卷操作,根据命令后跟随的command来确定下一步操作

create  创建一个volume
inspect  显示一个或多个volume的信息
ls  列出所有的volume
prune  删除未使用的volume
rm  删除一个或多个指定的volume

5.3.创建数据卷/查看所有数据

docker volume create  html/docker  volume ls

在这里插入图片描述

5.4.挂载数据卷

在运行容器的时候先创建一个数据卷,然后将容器中的某一个目录挂载到数据卷中,可以通过 -v 参数来挂载一个数据卷到某个容器内目录

docker --name nx -d -v 数据名:/usr/share/nginx/html -p 80:80 镜像名

5.5.本地目录挂载

如果使用的是卷挂载,文件会从当前容器中自动同步到宿主机,本地目录挂载不会同步容器内的文件,但可以自定义操作文件或文件夹,我么需要提前创建好一个文件夹,对应在当前部署的应用中去copy配置,然后在运行

5.6.安装nginx

在这里插入图片描述

6.6.1.安装redis

6.1.下载镜像

 docker pull redis:7.0.11

6.2.运行容器

docker run --name redis -d -p 6379:6379 -v redis:/usr/local/etc/redis/  redis:7.0.11

小结

在这里插入图片描述

数据卷挂载与本地目录挂载的不同?

1、数据卷挂载耦合度低,由docker来管理目录,目录较深时,不好寻找,能够反向同步数据

2、本地目录挂载耦合度高,自己来管理目录,目录容易查看,需要使用相同文件去替换,直接同步到容器中

DockerFile自定义镜像

7.7.1.镜像结构

镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k4jmVbXi-1683273212773)(E:\图6\docker\笔记\assets\1683270806737.png)]

7.7.2.DockerFile基础语法

Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jzS0jVX9-1683273212773)(E:\图6\docker\笔记\assets\1683270924540.png)]

7.7.3.构建java项目

1、基于ubuntu构建就是java项目

​ (1)新建一个空文件docker-demo,在里面放入jdk.tar.gz和项目打包好的文件app.jar

​ (2)创建一个文件Dockerfile,里面追加以下代码

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local
# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar
# 安装JDK
RUN cd $JAVA_DIR \
&& tar -xf ./jdk8.tar.gz \
&& mv ./jdk1.8.0_144 ./java8
# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

(3)进入docker-demo文件夹,进行构建

docker build -t javawebdemo:1.0 .

(4)运行这个镜像

docker run --name webdef -p 8090:8090 -d javaweb:1.0

Docker-compose

7.7.1简介

Compose文件是一个文本文件,通过指令文件集群中的每个容器运行

version: "3.8"
	services:
		mysql:
			image: mysql:5.7.25
			environment:
			MYSQL_ROOT_PASSWORD: 123	
			volumes:
    - "/tmp/mysql/data:/var/lib/mysql"
    - "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
   		 web:
			build: .
			ports:
			- "8090:8090"

上面的Compose文件就描述一个项目,其中包含两个容器:
1、mysql:一个基于 mysql:5.7.25 镜像构建的容器,并且挂载了两个目录
2、web:一个基于 docker build 临时构建的镜像容器,映射端口时8090

7.7.2.安装DockerCompose

1、通过命令下载

curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2、修改文件权限

chmod +x /usr/local/bin/docker-compose

3、Base自动补全命令

curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

Docker镜像仓库

8.8.1.搭建私有镜像仓库

1、配置Docker信任地址(我们采用的是http协议,默认不被Docker信任)

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容: 编辑后esc :wq保存
"insecure-registries":["http://192.168.253.100:8888"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

2、在opt文件夹下创建一个存放compose配置文件的文件夹

cd /opt
mkdir registry-ui
cd registry-ui
touch docker-compose.yaml

3、将下面配置写入文件

version: '3.0'
services:
 registry:
  image: registry
  volumes:
    - ./registry-data:/var/lib/registry
ui:
 image: joxit/docker-registry-ui:static
  #joxit/docker-registry-ui:1.5-static
 ports:
  - 8888:80
environment:
  - REGISTRY_TITLE=个人私有仓库
  - REGISTRY_URL=http://registry:5000
depends_on:
  - registry

4、执行compose命令

docker-compose up -d

docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3306:3306 mysql:8.0.33

5、推送、拉取镜像

推送镜像到私有镜像服务必须先tag

(1)重新tag本地镜像,名称前缀为私有仓库的地址

docker tag nginx:latest 192.168.253.100:8888/nginx:1.0
#docker tag nginx:latest 192.168.253.100:8888/nginx:latest

(2)推送镜像

docker push 192.168.253.100:8888/nginx:1.0
#docker push 192.168.253.100:8888/nginx:latest

(3)拉取镜像

docker pull 192.168.253.100:8888/nginx:1.0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值