Docker 学习笔记

news2024/9/22 9:35:44

概述

1. 什么是 Docker?

Docker 是一个应用容器平台,管理项目中用到的所有环境(MySQL、Redis…)

2. Docker 和虚拟机的区别

在这里插入图片描述

虚拟机是携带操作系统的,本身很小的应用程序因为携带了操作系统而变得十分笨重,Docker 不携带操作系统,所以 Docker 的应用非常轻巧

在调用宿主机资源时,虚拟机利用 Hypervisor 去虚拟化内存,整个调用过程是 虚拟内存 - 虚拟物理内存 - 真实物理内存,但是 Docker 利用 Docker Engine 去调用宿主机资源,这个过程是 虚拟内存 - 真实物理内存

3. Docker 核心架构

在这里插入图片描述

  • 镜像:一个镜像代表一个应用环境,它是一个只读的文件,如 MySQL 镜像,Tomcat 镜像,Nginx 镜像等
  • 容器:镜像每次运行之后就会产生一个容器,就是正在运行的镜像,特点是可读可写
  • 仓库:用来存放镜像的位置,类似于 maven 仓库,也是镜像上传和下载的位置
  • dockerFile:docker 生成镜像配置文件,用来书写自定义镜像的配置
  • tar:一个对镜像打包的文件,日后可以还原成镜像

4. Docker 运行流程

在这里插入图片描述


安装 Docker

以 Ubuntu18.04.4 为例

更新 ubuntu 的 apt 源索引

sudo apt-get update

安装包允许 apt 通过 HTTPS 使用仓库

sudo apt-get install \
	apt-transport-https \
	ca-certificates \
	curl \
	software-properties-common

添加 Docker 官方 GPG key

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置 Docker 稳定版仓库

sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

添加仓库后,更新 apt 源索引

sudo apt-get update

安装最新版 Docker CE(社区版)

sudo apt-get install docker-ce

检查 Docker CE 是否安装正确

sudo docker run hello-world

启动 docker

sudo service docker start

停止 docker

sudo service docker stop

重启 docker

sudo service docker restart

Docker 配置阿里云镜像加速服务,访问阿里云登录自己的账号查看 docker 镜像加速服务

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://e9rzpyni.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info	# 验证 docker 的镜像加速是否生效

Docker 镜像命令

# 辅助命令
docker version  # 查看 docker 命令
docker info     # 查看更详细的信息
docker --help   # 帮助命令
# images 镜像命令
docker images       # 查看本地所有镜像
docker images -a    # 列出所有镜像(包含中间映像层)
docker images -q    # 只显示镜像id
# 搜索镜像
docker search [镜像名]
docker search -s [镜像名]   # 列出收藏数不少于指定值的镜像
docker search --no-trunc [镜像名]   # 显示完整的镜像信息
# 拉取镜像
docker pull [镜像名]
# 删除镜像
docker rmi [镜像名]
docker rmi -f [镜像名]  # 强制删除
# 构建镜像
docker build -t [镜像名] [Dockerfile所在目录]
docker build -t [镜像名] [Dockerfile所在目录] --no-cache    # 禁用缓存

Docker 容器命令

## 运行容器
# --name  # 为容器起一个名字
# -p      # 映射端口号:原始端口号,指定端口号启动
# -d      # 启动守护式容器
# -rm    # 用完即删
docker run [镜像名]
## 查看运行的容器
# -a      # 正在运行的和历史运行过的容器
# -q      # 静默模式,只显示容器编号
docker ps   # 列出所有正在运行的容器
## 停止|关闭|重启容器
docker start 容器名字或容器id   # 开启容器
docker restart 容器名或容器id   # 重启容器
docker stop 容器名或容器id      # 正常停止容器运行
docker kill 容器名或容器id      # 立即停止容器运行
## 删除容器
docker rm [容器id]
docker rm -f [容器id]  # 强制删除
docker rm -f $(docker ps -qa)   # 全部容器删除
## 查看容器内的进程
docker top [容器名或容器id]     # 查看容器内的进程
## 查看运行容器内部的细节
docker inspect [容器id]     # 查看容器内部细节
## 查看容器的运行日志
# -t              # 加入时间戳
# -f              # 跟随最新的日志打印
# -tail [数字]    # 显示最后多少条
docker logs [OPTIONS] [容器id或容器名]  # 查看容器日志
## 容器内数据交互
# 进入容器内部
# -i  # 以交互模式运行容器,通常与 -t 一起使用
# -t  # 分配一个伪终端,命令后要跟一个 shell 窗口,如 /bin/bash
docker exec [options] [容器id]
# 退出容器
exit
## 将容器打包为新的镜像
docker commit -a="[作者]" -m="[描述信息]" [容器id] [目标镜像名称]:TAG
## 从容器中复制文件到宿主机目录中
docker cp 容器id:容器内资源路径 宿主机目录路径
## 设置容器和宿主机共享目录
# 宿主机必须是绝对路径,宿主机目录会覆盖容器内目录内容
docker run -it -v /[宿主机路径]:/[容器内的路径]:镜像名
# 检查 json 字符串有没有以下内容,如果有则证明卷挂载成功
# "Mounts":[
# 	{
# 		"Type":"bind",
#       "Source":"/hostDataValueme",
#       "Destination":"/containerDataValueme",
#       "Mode":"",
#       "RW":true,
#       "Propagation":"rprivate"
#	}
# ]
docker inspect [容器id]
## 打包镜像
docker save [镜像名] -o [名称].tar
## 载入镜像
docker load -i [名称].tar

Docker 安装 MySQL

以 Ubuntu18.04.4 为例

拉取 mysql 镜像到本地

sudo docker pull mysql:tag  # tag 不加默认最新版本

运行 mysql 服务

# 没有暴露外部端口,外部不能连接
docker run --name [自定义容器名称] -e MYSQL_ROOT_PASSWORD=[设置 root 密码] -d mysql:tag
# 暴露外部端口
docker run --name [自定义容器名称] -e MYSQL_ROOT_PASSWORD=[设置 root 密码] -p 3306:3306 -d mysql:tag

进入 mysql 容器

sudo docker exec -it [容器名称]|[容器id] bash

外部查看 mysql 日志

sudo docker logs [容器名称]|[容器id]

使用自定义配置参数

docker run --name [自定义容器名称] -v [宿主机配置文件目录]:[容器中配置文件目录] -e MYSQL_ROOT_PASSWORD=[设置 root 密码] -p 3306:3306 -d mysql:tag

将容器数据位置与宿主机位置挂载保证数据安全

docker run --name [自定义容器名称] -v [宿主机配置文件目录]:[容器中配置文件目录] -v [宿主机数据文件目录]:[容器中数据文件目录] -e MYSQL_ROOT_PASSWORD=[设置 root 密码] -p 3306:3306 -d mysql:tag

将 mysql 数据库备份为 sql 文件

# 导出全部数据
sudo docker exec mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库数据
sudo docker exec mysql sh -c 'exec mysqldump --databases [库表] -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库,但不要数据
sudo docker exec mysql sh -c 'exec mysqldump --no-data --databases [库表] -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

执行 sql 文件到 mysql

sudo docker exec -i mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /root/xxx.sql

Docker 安装 Redis

以 Ubuntu18.04.4 为例

在 docker hub 搜索 redis 镜像

sudo docker search redis

拉取 redis 镜像到本地

sudo docker pull redis

运行 redis 服务

# 没有暴露外部端口,外部不能连接
sudo docker run --name [自定义容器名称] -d redis:tag
# 暴露外部端口
sudo docker run --name [自定义容器名称] -p 6379:6379 -d redis:tag

外部查看 redis 日志

sudo docker logs -t -f [容器名称]|[容器id]

进入容器内部查看

sudo docker exec -it [容器名称]|[容器id] bash

加载外部自定义配置启动 redis 容器,默认情况下 redis 官方镜像中没有 redis.conf 配置文件,需要去官网下载指定版本的配置文件

sudo docker run --name [自定义容器名称] -v [宿主机配置文件路径]:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis:tag redis-server /usr/local/etc/redis/redis.conf

将数据目录挂载到本地保证数据安全

sudo docker run --name [自定义容器名称] -v [宿主机数据目录]:/data -v [宿主机配置文件路径]:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis:tag redis-server /usr/local/etc/redis/redis.conf

Docker 安装 Nginx 服务器

以 Ubuntu18.04.4 为例

在 docker hub 搜索 Nginx 镜像

sudo docker search nginx

拉取 nginx 镜像到本地

sudo docker pull nginx

运行 nginx 服务

# 没有暴露外部端口,外部不能连接
sudo docker run --name [自定义容器名称] -d nginx:tag
# 暴露外部端口
sudo docker run --name [自定义容器名称] -p 80:80 -d redis:tag

进入容器内部

sudo docker exec -it [容器名称]|[容器id] /bin/bash
# 查找目录
whereis nginx
# 配置文件
/etc/nginx/nginx.conf

从容器复制配置文件到主机

dokcer cp [容器名称]|[容器id]:/etc/nginx/nginx.conf [宿主机目录]

挂载 nginx 配置以及 html 到宿主机外部

sudo docker run --name [自定义容器名称] -v [宿主机配置文件路径]:/etc/nginx/nginx.conf -v [宿主机 html 目录]:/usr/share/nginx/html -p 80:80 -d nginx

Docker 安装 Tomcat 服务器

以 Ubuntu18.04.4 为例

在 docker hub 搜索 tomcat

sudo docker search tomcat

下载 Tomcat 镜像

sudo docker pull tomcat

运行 tomcat 镜像

sudo dokcer run -p 8080:8080 -d --name [自定义容器名称] tomcat

进入容器内部

sudo docker exec -it [容器名称]|[容器id] /bin/bash

将 webapps 目录挂载到外部

sudo docker -p 8080:8080 -v [宿主机webapps目录]:/usr/local/tomcat/webapps -d --name [自定义容器名称] tomcat

Docker 安装 MongoDB 数据库

以 Ubuntu18.04.4 为例

在 docker hub 搜索 mongo

sudo docker search mongo    # 无须权限

运行 mongoDB

sudo docker run -d -p 27107:27107 --name [自定义容器名称] mongo

查看 mongo 的运行日志

sudo docker logs -f [容器名称]

进入容器内部

sudo docker exec -it [容器名称]|[容器id] /bin/bash

运行具有权限的容器

sudo docker run --name [容器名称] -p 27017:27017 -d mongo --auth

进入容器配置用户名和密码

# 进入 mongo 客户端
mongo
# 选择 admin 库
use admin
# 创建用户,此用户创建成功,则后续操作都需要用户认证
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]})
# 退出
exit

将 mongoDB 中数据目录映射到宿主机中

sudo docker run -d -p 27017:27017 [宿主机数据目录]:/data/db --name [自定义容器名称] mongo

Docker 安装 Elasticsearch 以及 Kibana 服务

预先配置

# 修改配置 sysctl.conf
sudo vim /etc/sysctl.conf
# 加入如下配置
vm.max_map_count=262144
# 启用配置
sysctl -p

docker hub 拉取镜像

sudo docker pull elasticsearch

运行 docker 镜像

sudo docker run -d -p 9200:9200 -p 9300:9300 --name [自定义容器名称] elasticsearch

复制容器中 data 目录到宿主机

sudo docker cp [容器id]:/usr/share/share/elasticsearch/data [宿主机目录]

运行 es 容器,指定 jvm 内存大小并指定 ik 分词器的位置

sudo docker run -d --name  [自定义容器名称] -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v [宿主机插件目录]:/usr/share/elasticsearch/plugins -v [宿主机data目录]:/usr/share/elasticsearch/data elasticsearch:tag

拉取 kibana 镜像

sudo docker pull kibana

启动 kibana 容器

sudo docker run -d --name [自定义容器名称] -e ELASTICSEARCH_URL=[elasticsearch服务url] -p 5601:5601 kibana

Dockerfile

1. 概述

Dockerfile 可以认为是 Docker 镜像的描述文件,是由一系列命令和参数构成的脚本,主要作用是用来构建 docker 镜像

2. Dockerfile 解析过程

在这里插入图片描述

3. Dockerfile 的保留命令

## FROM:当前镜像基于哪个镜像构建,构建时会自动拉取 base 镜像(第一个指令必须是 FROM)
FROM [镜像]
FROM [镜像]:tag
FROM [镜像]:[@<digest>]     # 使用摘要
## MAINTAINER:镜像维护者的姓名和邮箱地址
MAINTAINER [作者信息]
## RUN:构建镜像时需要运行的指令,并提交结果,生成的提交映像将用于 Dockerfile 的下一步
RUN [shell命令格式]
RUN yum install vim
RUN [json格式]
RUN ["yum","install","vim"]
## EXPOSE:构建的镜像创建容器时对外暴露的端口号
EXPOSE 80/tcp   # 没有显示指定默认是 tcp
EXPOSE 80/udp
## WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
WORKDIR [路径]
## ENV:用来在构建镜像过程中设置环境变量
ENV [键] [值]
ENV [键]=[值]
## AOD:将宿主机下的文件或目录拷贝到镜像且 ADD 命令会自动处理 URL 和解压 tar 包
ADD [要拷贝的文件/目录] [镜像中的目录]  # 第一个参数可以使用通配符
ADD [url] [镜像中的目录]
## COPY:类似 ADD,拷贝文件和目录到镜像,但不能处理 URL 和解压 tar 包
## VOLUME:容器运行时可以挂载到宿主机的目录
VOLUME [容器中可以挂载到宿主机的目录]
## CMD:构建的镜像启动容器时要运行的命令,DockerFile 中可以有多个 CMD 指令,但最后只有一个生效,CMD 会被 docker run 之后的参数替换,格式与 RUN 一致
## ENTRYPOINT:和 CMD 一样,指定容器时执行命令,格式与 RUN 一致,如果要覆盖,必须使用 --entrypoint="[新命令]" [镜像名] [其他参数]

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WebRTC paced sender

文章目录4.1 pacer创建4.2 音视频数据包发送4.3 webrtc::PacketRouter4.4 Pacer 媒体数据发送控制4.5 pacer 中的码率探测paced sender通常简称为pacer&#xff0c;其是WebRTC RTP栈的一部分&#xff0c;用于平滑发送到网络上的数据流包&#xff0c;考虑一个帧率为60fps带宽为1…

linux高级命令之线程的注意点

线程的注意点学习目标能够说出线程的注意点1. 线程的注意点介绍线程之间执行是无序的主线程会等待所有的子线程执行结束再结束线程之间共享全局变量线程之间共享全局变量数据出现错误问题2. 线程之间执行是无序的import threading import timedeftask():time.sleep(1)print(&qu…

一句话解读《持续交付》核心能力

​DevOps 是基于持续交付的软件工程。DevOps的核心知识体系在DevOps 四书。持续交付主要是指应用软件集成交付环节&#xff0c;通过配置管理、构建与持续集成、测试管理、部署与发布管理、环境管理、数据管理和度量管理领域的能力建设和工程实践保证软件持续顺畅高质量的对用户…

JavaWeb9-volatile解决内存可见性和指令重排序问题

目录 1.解决内存可见性问题 2.解决指令重排序问题 3.volatile缺点 4.特使使用场景 volatile&#xff08;易变的&#xff0c;易挥发的&#xff0c;不稳定的&#xff09;可以解决内存可见性和指令重排序的问题。 1.解决内存可见性问题 代码在写入 volatile 修饰的变量时&am…

【Linux】自定义生成Kickstart(system-config-kickstart)

文章目录前言一、安装二、运行三、配置3.1 基本配置3.2 安装方法3.3 引导装载程序选项3.4 分区信息3.5 网络配置3.6 验证3.7 防火墙配置3.8 显示配置3.9 软件包选择3.10 预安装脚本3.11 安装后脚本3.12 保存与查看四、总结前言 本文简单介绍下system-config-kickstart的使用&a…

AMQP协议介绍

这篇文章主要介绍AMQP 0-9-1 协议&#xff0c;是RabbitMQ支持的协议之一&#xff0c;理解AQMP对于使用和理解RabbitMQ也很有帮助。 AMQP 0-9-1&#xff08;高级消息队列协议&#xff09;是一种消息传递协议&#xff0c;它使客户端应用程序能与消息中间件进行通信。消息中间件接…

Alibaba Arthas

Alibaba Arthas 基于arthas 3.4.6 Arthas是Alibaba开源的Java诊断工具 可以用来解决 查看class 的加载路径&#xff0c;排除ClassLoader 双向委派存在的问题 程序在线反编译&#xff0c;与热更新 监控到JVM的实时运行状态&#xff08;线程状态&#xff0c;程序热点&#x…

敏感词之 DFA 算法

敏感词之 DFA 算法 常用算法 遍历匹配 将输入的词语&#xff0c;与词库中的敏感词逐个字符遍历&#xff0c;对比是否包含 优点&#xff1a;思路简单&#xff0c;易于实现&#xff08;KMP 算法&#xff0c;Brute-Force 算法&#xff09; 缺点&#xff1a;当词库数目非常大时…

uniapp自定义验证码输入框,隐藏光标

一. 前言 先看下使用场景效果图&#xff1a; 点击输入框唤起键盘&#xff0c;蓝框就相当于input的光标&#xff0c;验证码输入错误或者不符合格式要求会将字体以及边框改成红色提示&#xff0c;持续1s&#xff0c;然后清空数据&#xff0c;恢复原边框样式&#xff1b;5位验证…

【Kubernetes】【十二】Pod详解 Pod调度

Pod调度 ​ 在默认情况下&#xff0c;一个Pod在哪个Node节点上运行&#xff0c;是由Scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的。但是在实际使用中&#xff0c;这并不满足的需求&#xff0c;因为很多情况下&#xff0c;我们想控制某些Pod到达…

Prometheus监控案例-tomcat、mysql、redis、haproxy、nginx

监控tomcat tomcat自身并不能提供监控指标数据&#xff0c;需要借助第三方exporter实现&#xff1a;https://github.com/nlighten/tomcat_exporter 构建镜像 基于tomcat官方镜像&#xff0c;重新制作一个镜像&#xff0c;将tomcat-exporter和tomcat整合到一起。Ddockerfile如…

【安全知识】——如何绕过cdn获取真实ip

作者名&#xff1a;白昼安全主页面链接&#xff1a; 主页传送门创作初心&#xff1a; 以后赚大钱座右铭&#xff1a; 不要让时代的悲哀成为你的悲哀专研方向&#xff1a; web安全&#xff0c;后渗透技术每日鸡汤&#xff1a; 现在的样子是你想要的吗&#xff1f;cdn简单来说就是…

商标侵权行为的种类有哪些

商标侵权行为的种类有哪些 1、商标侵权行为的种类有以下七种&#xff1a; (1)未经商标注册人的许可&#xff0c;在同一种商品上使用与其注册商标相同的商标的; (2)未经商标注册人的许可&#xff0c;在同一种商品上使用与其注册商标近似的商标&#xff0c;或者在类似商品上使…

Python3 面向对象实例及演示

Python从设计之初就已经是一门面向对象的语言&#xff0c;正因为如此&#xff0c;在Python中创建1个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果以前没有接触过面向对象的编程语言&#xff0c;那可能需要先了解一些面向对象语言的一些基本特征&…

SPI+DMA传输性能比较

本文章仅仅简单记录32单片机的SPIDMA驱动显示屏的性能测试&#xff0c;这里不花费时间介绍SPI和DMA。 硬件材料&#xff1a;SPI显示屏一个&#xff0c;32单片机 软件材料&#xff1a; 1.LCD的SPI驱动显示程序&#xff08;SPI / SPIDMA&#xff09;&#xff1a; &#xff08;1&a…

葡萄酒(WINE)数据集分类(PyTorch实现)

一、数据集介绍 Data Set Information: These data are the results of a chemical analysis of wines grown in the same region in Italy but derived from three different cultivars. The analysis determined the quantities of 13 constituents found in each of …

QML debugging is enabled. Only use this in a safe environment.

系列文章目录 文章目录系列文章目录前言一、Qt Quick是什么1.QML核心二、使用步骤1.main.cpp3.运行结果前言 因为有个需求&#xff1a;C和web交互&#xff0c;初步想到在Qt中使用QWebChannel 今天第一次使用Qt Qml&#xff0c;建了qt Quick工程 一、Qt Quick是什么 QML&…

代码随想录算法训练营第三十五天 | 435. 无重叠区间,763.划分字母区间,56. 合并区间

一、参考资料无重叠区间 https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html 划分字母区间https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html 合并区间https://programmercarl.com/0056.%E5%90…

分享111个HTML艺术时尚模板,总有一款适合您

分享111个HTML艺术时尚模板&#xff0c;总有一款适合您 111个HTML艺术时尚模板下载链接&#xff1a;https://pan.baidu.com/s/1sYo2IPma4rzeku3yCG7jGw?pwdk8dx 提取码&#xff1a;k8dx Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 时尚理发沙龙服务网站模…

实现8086虚拟机(二)——模拟CPU和内存

文章目录CPU 架构EU&#xff08;执行单元&#xff09;BIU&#xff08;总线接口单元&#xff09;小结一下模拟内存模拟 BIU模拟 EU模拟 CPU总结要模拟 8086 CPU 运行&#xff0c;必须知道 CPU 的一些知识。下文的知识点都来自《Intel_8086_Family_Users_Manual 》。CPU 架构 微…