- 1. Docker 的入门应用
- 2. Docker 常用命令
- 3. Docker 镜像原理
- 4. Docker 安装常用服务
- 1. 拉取 mysql 镜像到本地
- 2. 运行 mysql 服务
- 3. 进入 mysql 容器
- 4. 外部查看 mysql 日志
- 5. 使用自定义配置参数
- 6. 将容器数据位置与宿主机位置挂载保证数据安全
- 7. 通过其他客户端访问,如在 windows 系统下使用数据库工具访问
- 8. 将 mysql 数据库备份为 sql 文件
- 9. 执行 sql 文件到 mysql 中
- 1. 在docker hub搜索redis镜像
- 2. 拉取redis镜像到本地
- 3. 启动redis服务运行容器
- 4. 查看启动日志
- 5. 进入容器内部查看
- 6. 加载外部自定义配置启动redis容器
- 默认情况下redis官方镜像中没有redis.conf配置文件 需要去官网下载指定版本的配置文件
- 7. 将数据目录挂在到本地保证数据安全
- 1. 在docker hub搜索nginx
- 2. 拉取nginx镜像到本地
- 3. 启动nginx容器
- 4. 进入容器
- 查找目录: whereis nginx
- 配置文件: /etc/nginx/nginx.conf
- 5. 复制配置文件到宿主机
- 6. 挂在nginx配置以及html到宿主机外部
- 1. 在docker hub搜索tomcat
- 2. 下载tomcat镜像
- 3. 运行tomcat镜像
- 4. 进入tomcat容器
- 5. 将webapps目录挂载在外部
- 1. 运行mongDB
- 2. 进入mongodb容器
- 3. 常见具有权限的容器
- 4. 进入容器配置用户名密码
- 5. 将mongoDB中数据目录映射到宿主机中
- 1.dockerhub 拉取镜像
- 2.查看docker镜像
- 3.运行docker镜像
- 5. Docker 中出现如下错误解决方案
1. Docker 的入门应用
1.1 docker 的第一个程序
[root@yongz ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:61bd3cb6014296e214ff4c6407a5a7e7092dfa8eefdbbec539e133e97f63e09f
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
2. Docker 常用命令
2.1 辅助命令
# 1. 安装完成辅助命令
- docker version ----------------- 查看 docker 的信息
- docker info ----------------- 查看更详细的信息
- docker --help ----------------- 帮助命令
2.2 镜像命令
# 1. 查看本机中所有镜像
- docker images ----------------- 列出本地所有镜像
-a:列出所有镜像(包含中间映象层)
-q:只显示 images id
# 2. 搜索镜像
- docker search [options] 镜像名 -------------- 去 dcokerhub 上查询当前镜像
-f 指定值:列出指定值的镜像
--no-trunc:显示完整的镜像信息
# 3. 从仓库下载镜像
- docker pull 镜像名[:TAG | @DIGEST] ----------- 下载镜像
# 4. 删除镜像
- docker rmi 镜像名 -------------- 删除镜像
-f:强制删除
- docker rmi $(docker images -aq)
2.3 容器命令
# 1. 运行容器
- docker run 镜像名 ---------------- 镜像名新建并启动容器
--name:为容器命令
-d:守护进程(在后台启动容器)
-p:主机端口号:容器端口号 (指定端口号启动)
-P:随机端口启动
# 2. 查看运行的容器
- docker ps ------------------- 列出所有正在运行的容器
-a:正在运行的和历史运行过的容器
-q:显示 container id
# 3. 停止 | 关闭 | 重启容器
- docker start | restart | stop | kill 容器名字或者容器id ---------- 开启/重启/正常停止/立即停止
# 4. 删除容器
- docker rm -f 容器 id 和容器名
- docker rm -f $(docker ps -qa) --------------------------- 删除所有容器
# 5. 查看容器内进程
- docker top 容器 id 或者容器名 --------------- 查看容器内的进程
# 6. 查看容器内部细节
- docker inspect 容器 id ----------------- 查看容器内部细节
# 7. 查看容器的运行日志
- docker logs [OPTIONS] 容器 id 或者容器名 -------------------- 查看容器日志
-t:加入时间戳
-f:打印最新的日志
--tail number:显示最后多少条
# 8. 进入容器内部
- docker exec [options] 容器 id 容器内命令 -------------------- 进入容器执行命令
-i:以交互模式运行容器,通常与 -t 一起使用
-t:分配一个伪终端
-it:以交互模式进入容器,但需要在最后添加 /bin/bash,不然无交互对象
# 9. 容器和宿主机之间赋值文件
- docker cp 文件 | 目录 容器 id:容器路径 --------------- 将宿主机文件复制到容器内部
- docker cp 容器 id:容器内部资源路径 宿主机目录路径 ---------- 将容器内部文件赋值到宿主机
# 10. 数据卷(Volume)实现与宿主机共享目录
- docker run -v 宿主机的路径 | 任意别名:/容器内部路径 镜像名
注意:
1. 如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
2. 如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中
# 11. 打包镜像
- docker save 镜像名 -o 名称.tar
# 12. 载入镜像
- docker load -i 名称.tar
# 13. 容器打包成新的镜像
- docker commit -m='描述' -a='作者' (容器id或者名称)打包的镜像名称:标签
3. Docker 镜像原理
3.1 镜像是什么 ?
镜像是一种轻量级的,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时所需的库、环境变量和配置文件。
3.2 为什么一个镜像会那么大 ?
镜像就是花卷UnionFS(联合文件系统)
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。在docker镜像的最底层就是bootfs。这一层与Linux/Unix 系统是一样的,包含boot加载器(bootloader)和内核(kernel)。当boot加载完,后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时会卸载bootfs。
- rootfs(root file system),在bootfs之上,包含的就是典型的linux系统中的/dev,/proc,/bin,/etc等标准的目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu/CentOS等等。
- 我们平时安装进虚拟机的centos都有1到几个GB,为什么docker这里才200MB?对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令,工具,和程序库就可以了,因为底层直接使用Host的Kernal,自己只需要提供rootfs就行了。由此可见不同的linux发行版,他们的bootfs是一致的,rootfs会有差别。因此不同的发行版可以共用bootfs。
3.4 为什么 Docker 镜像要采用这种分层结果呢 ?
最大的一个好处就是资源共享
- 比如:有多个镜像都是从相同的base镜像构建而来的,那么宿主机只需在磁盘中保存一份base镜像。同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。Docker镜像都是只读的。当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称为容器层,容器层之下都叫镜像层。
4. Docker 安装常用服务
4.1 安装 mysql
```1. 拉取 mysql 镜像到本地
- docker pull mysql:tag(tag 不加默认最新版本)
2. 运行 mysql 服务
- docker run —name mysql -e MYSQL_ROOT_PASSWORD-=root -d mysql:tag
-- 没有对外暴露端口,无法连接
- docker run —name mysql -e MYSQL_ROOT_PASSWORD-=root -d -p 3306:3306 mysql:tag
3. 进入 mysql 容器
- docker exec -it 容器名称 | 容器 id /bin/bash
4. 外部查看 mysql 日志
- docker logs 容器名称 | 容器 id
5. 使用自定义配置参数
- docker run —name mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
6. 将容器数据位置与宿主机位置挂载保证数据安全
- docker run —name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag
7. 通过其他客户端访问,如在 windows 系统下使用数据库工具访问
-- 云服务器记得打开对应端口
8. 将 mysql 数据库备份为 sql 文件
- docker exec mysql|容器id sh -c ‘exec mysqldump —all-databases -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
-- 导出全部数据
- docker exec mysql sh -c ‘exec mysqldump —databases 库表 -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
-- 导出指定库数据
- docker exec mysql sh -c ‘exec mysqldump —no-data —databases 库表 -uroot -p”$MYSQL_ROOT_PASSWORD”‘ > /root/all-databases.sql
-- 导出指定库数据不要数据
9. 执行 sql 文件到 mysql 中
- docker exec -i mysql sh -c ‘exec mysql -uroot -p”$MYSQL_ROOT_PASSWORD”‘ < /root/xxx.sql
<a name="Sx3DA"></a> ## 4.2 安装 Redis 服务
1. 在docker hub搜索redis镜像
- docker search redis
2. 拉取redis镜像到本地
- docker pull redis
3. 启动redis服务运行容器
- docker run —name redis -d redis:tag (没有暴露外部端口)
- docker run —name redis -p 6379:6379 -d redis:tag (暴露外部宿主机端口为6379进行连接)
4. 查看启动日志
- docker logs -t -f 容器id|容器名称
5. 进入容器内部查看
- docker exec -it 容器id|名称 bash
6. 加载外部自定义配置启动redis容器
默认情况下redis官方镜像中没有redis.conf配置文件 需要去官网下载指定版本的配置文件
1. wget http://download.redis.io/releases/redis-5.0.8.tar.gz 下载官方安装包
2. 将官方安装包中配置文件进行复制到宿主机指定目录中如 /root/redis/redis.conf文件
3. 修改需要自定义的配置
bind 0.0.0.0 开启远程权限
appenonly yes 开启aof持久化
4. 加载配置启动
- docker run —name redis -v /root/redis:/usr/local/etc/redis -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
7. 将数据目录挂在到本地保证数据安全
- docker run —name redis -v /root/redis/data:/data -v /root/redis/redis.conf:/usr/local/etc/redis/redis.conf -p 6379:6379 -d redis redis-server /usr/local/etc/redis/redis.conf
<a name="Hvo3U"></a> ## 4.3 安装 Nginx
1. 在docker hub搜索nginx
- docker search nginx
2. 拉取nginx镜像到本地
- [root@localhost ~]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx afb6ec6fdc1c: Pull complete b90c53a0b692: Pull complete 11fa52a0fdc0: Pull complete Digest: sha256:30dfa439718a17baafefadf16c5e7c9d0a1cde97b4fd84f63b69e13513be7097 Status: Downloaded newer image for nginx:latest docker.io/library/nginx:latest
3. 启动nginx容器
- docker run -p 80:80 —name nginx01 -d nginx
4. 进入容器
5. 复制配置文件到宿主机
- docker cp nginx01(容器id|容器名称):/etc/nginx/nginx.conf 宿主机名录
6. 挂在nginx配置以及html到宿主机外部
- docker run —name nginx02 -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx
<a name="X6Byz"></a> ## 4.4 安装 Tomcat
1. 在docker hub搜索tomcat
- docker search tomcat
2. 下载tomcat镜像
- docker pull tomcat
3. 运行tomcat镜像
- docker run -p 8080:8080 -d —name mytomcat tomcat
4. 进入tomcat容器
- docker exec -it mytomcat /bin/bash # 这时 tomcat 服务没启动
5. 将webapps目录挂载在外部
- docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d —name mytomcat tomcat
<a name="ilrwy"></a> ## 4.5 安装 MongoDB 数据库
1. 运行mongDB
- docker run -d -p 27017:27017 —name mymongo mongo —-无须权限
- docker logs -f mymongo —查看mongo运行日志
2. 进入mongodb容器
- docker exec -it mymongo /bin/bash 直接执行mongo命令进行操作
3. 常见具有权限的容器
- docker run —name mymongo -p 27017:27017 -d mongo —auth
4. 进入容器配置用户名密码
mongo
use admin 选择admin库
db.createUser({user:"root",pwd:"root",roles:[{role:'root',db:'admin'}]}) //创建用户,此用户创建成功,则后续操作都需要用户认证
exit
5. 将mongoDB中数据目录映射到宿主机中
docker run -d -p 27017:27017 -v /root/mongo/data:/data/db —name mymongo mongo ```
4.6 安装 ElasticSearch
注意
- docker pull elasticsearch:6.4.2
2.查看docker镜像
- docker images
3.运行docker镜像
docker run -p 9200:9200 -p 9300:9300 elasticsearch:6.4.2 ```
启动出现如下错误
4.6.1 预先配置
# 1.在centos虚拟机中,修改配置sysctl.conf
vim /etc/sysctl.conf
# 2.加入如下配置
vm.max_map_count=262144
# 3.启用配置
sysctl -p
注:这一步是为了防止启动容器时,报出如下错误:
bootstrap checks failed max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
4.6.2 启动 ES
# 0. 复制容器中data目录到宿主机中
- docker cp 容器id:/usr/share/share/elasticsearch/data /root/es
# 1. 运行ES容器 指定jvm内存大小并指定ik分词器位置
- docker run -d --name es -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms128m -Xmx128m" -v /root/es/plugins:/usr/share/elasticsearch/plugins -v /root/es/data:/usr/share/elasticsearch/data elasticsearch:6.4.2
4.6.3 安装 IK 分词器
# 1.下载对应版本的IK分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.2/elasticsearch-analysis-ik-6.4.2.zip
# 2.解压到plugins文件夹中
yum install -y unzip
unzip -d ik elasticsearch-analysis-ik-6.4.2.zip
# 3.添加自定义扩展词和停用词
cd plugins/elasticsearch/config
vim IKAnalyzer.cfg.xml
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext_dict.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">ext_stopwords.dic</entry>
</properties>
# 4.在ik分词器目录下config目录中创建ext_dict.dic文件 编码一定要为UTF-8才能生效
vim ext_dict.dic 加入扩展词即可
# 5. 在ik分词器目录下config目录中创建ext_stopword.dic文件
vim ext_stopwords.dic 加入停用词即可
# 6.重启容器生效
- docker restart 容器id
# 7.将此容器提交成为一个新的镜像
- docker commit -a="xiaochen" -m="es with IKAnalyzer" 容器id xiaochen/elasticsearch:6.4.2
4.6.4 安装 Kibana
# 1. 下载kibana镜像到本地
- docker pull kibana:6.4.2
# 2. 启动kibana容器
- docker run -d --name kibana -e ELASTICSEARCH_URL=http://10.15.0.3:9200 -p 5601:5601 kibana:6.4.2
5. Docker 中出现如下错误解决方案
[root@localhost ~]# docker search mysql 或者 docker pull 这些命令无法使用
Error response from daemon: Get https://index.docker.io/v1/search?q=mysql&n=25: x509: certificate has expired or is not yet valid
- 注意
- 这个错误的原因在于系统的时间和 Docker Hub 时间不一致,需要使系统时间与网络时间同步
# 1. 安装时间同步 sudo yum -y install ntp ntpdate # 2. 同步时间 sudo ntpdate cn.pool.ntp.org # 3. 查看本机时间 date
- 这个错误的原因在于系统的时间和 Docker Hub 时间不一致,需要使系统时间与网络时间同步