完成中.

I. Mysql

DockerHub 官方下载 MySql




Docker指南 pdf docker实战 pdf_docker增加端口映射


使用 docker pull 下载成熟的 mysql 5.7.31


## 下载
$ sudo docker pull mysql:5.7.31

## 检查下载的镜像并获得镜像 ID: 718a6da099d8

$ root@ubuntu-xenial:/home/vagrant# sudo docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
mysql                              5.7.31              718a6da099d8        4 weeks ago         448MB

## 运行镜像ID 718a6da099d8
$ sudo docker run -p 3306:3306 -d f6509bac4980 ### 小p参数定义端口为 3306


在 Description 页面查看安装说明


## 官方给与的安装命令行
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag


运行容器


## 运行 mysql 容器并设置 root 密码

$ root@ubuntu-xenial:/home/vagrant#  sudo docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d 718a6da099d8
d4ee3ed775ad2ab15011abacf6372392ef25065ccf670d3bedb453b981520403

### mysql的 root 用户密码就是:my-secret-pw
### -d 后台运行
### -p 自定义端口, 前面的 3306 是本地的, 后面的 3306 是容器的. 大 P 参数是随机端口

## 获得容器ID d4ee3ed775ad

$ root@ubuntu-xenial:/home/vagrant# sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
d4ee3ed775ad        718a6da099d8        "docker-entrypoint.s…"   7 seconds ago       Up 5 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   boring_euclid

## 进入容器并登录 mysql

$ root@ubuntu-xenial:/home/vagrant# sudo docker exec -it d4ee3ed775ad /bin/bash

### exec 方式进入容器, 并设置命令行模式为 /bin/bash

$ root@d4ee3ed775ad:/# mysql -u root -p     ### 登录 mysql,密码见上方.
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 11
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;             ### 查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)


Docker指南 pdf docker实战 pdf_docker增加端口映射_02


因为我们使用的是虚拟机,所以我们还需要在本机和我们虚拟机之间做一次端口的映射。
首先我们要来修改我们的vagrant配置文件


## 在 macOS 系统 home 目录下修改 Vagrantfile 配置文件
$ maskdeiMac:~ mask$ pwd
/Users/mask
$ maskdeiMac:~ mask$ ls Vagrantfile
Vagrantfile

## 使用 vim 编辑 Vagrantfile 的内容
$ maskdeiMac:~ mask$ vim Vagrantfile
## 增加一行

# NOTE: This will enable public access to the opened port
config.vm.network "forwarded_port", guest: 8080, host: 8280  ### 之前网页hi失败的实验
config.vm.network "forwarded_port", guest: 3306, host: 3309  ### mysql 映射
### 把本机的 3309 映射到虚拟机的 3306 端口

## 保存 Vagrantfile 后重启 vagrant
$ vagrant reload


因为我们并没有把 Docker 我们的道口容器设置成随我们的虚拟机重启而重启,所以每次我们都要去重新启动一下。但是如果大家如果希望可是可以把它做到随着我们机器的启动而自动重启的


## 重新启动 docker
$ vagrant@ubuntu-xenial:~$ sudo docker restart d4ee3ed775ad
d4ee3ed775ad

## 查看是否启动了容器
$ vagrant@ubuntu-xenial:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
d4ee3ed775ad        718a6da099d8        "docker-entrypoint.s…"   About an hour ago   Up 18 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   boring_euclid

## 使用第三方工具链接 mysql
所用工具为 IDEA


Docker指南 pdf docker实战 pdf_mysql从入门到精通明日科技_03


Docker指南 pdf docker实战 pdf_docker增加端口映射_04


MySQL 访问之 端口映射实验 2

先上结果


Docker指南 pdf docker实战 pdf_mysql从入门到精通明日科技_05


做了三步:

1. 端口安排 --- 更改 VagrantFile 的配置


## 映射物理机和虚拟机机的端口
$ 增加一行 config.vm.network "forwarded_port", guest: 3307, host: 3310

把虚拟机 guest 的 3307 端口映射到 host 物理机的 3310 端口


2. 启动带端口映射的 mysql 容器


$ sudo docker run -p 3307:3306 -v /tmp/mysqldemo:/var/lib/mysql   -e MYSQL_ROOT_PASSWORD=123456 -d --name=mysqldemo5 718a6da099d8
### 把 docker 容器 3306 端口映射到虚拟机 3307 端口


3. 第三方 mysql 工具连接"mysql 容器"

上图就是连接成功的示例: IDEA 中安装数据库插件 Database Navigator


Docker指南 pdf docker实战 pdf_mysql从入门到精通明日科技_06


## 数据持久化问题

数据的持久化问题。我们知道如果说我们的容器销毁的时候,我们的数据也会丢失,所以为了解决这个问题,我们可以使用 volume来把我们的数据卷进行挂载,形成本地到容器之间的一个映射,从而实现把数据保存到本地的目的


## 1. 建立对应的本地文件夹

$ mkdir -p /tmp/mysqldemo  ### 就是建立在Mac电脑本机的根目录下.
$ ls /tmp/mysqldemo        ### 返回是空的



## 2. 映射新端口 3307 以及目录
$ vagrant@ubuntu-xenial:~$ sudo docker run -p 3307:3306 -v /tmp/mysqldemo:/var/lib/mysql   -e MYSQL_ROOT_PASSWORD=123456 -d --name=mysqldemo2 718a6da099d8
8477eafb5063ef57115f628c6d4620caba0ec7efd7c4f762528f0456b254a4d7

$ vagrant@ubuntu-xenial:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
8477eafb5063        718a6da099d8        "docker-entrypoint.s…"   3 seconds ago       Up 3 seconds        33060/tcp, 0.0.0.0:3307->3306/tcp   mysqldemo2
d4ee3ed775ad        718a6da099d8        "docker-entrypoint.s…"   About an hour ago   Up 23 minutes       0.0.0.0:3306->3306/tcp, 33060/tcp   boring_euclid

## 3. 检查两个目录的内容是否一致. 
## Vagrant 这个虚拟机的本地目录 /tmp/mysqldemo 
和 启动的容器 /var/lib/mysql 容器目录


见图: vagrant 这个虚拟机的本地目录 /tmp/mysqldemo 和 启动的容器 /var/lib/mysql 是一致的, 包括内容一致.


Docker指南 pdf docker实战 pdf_Docker指南 pdf_07


II. Wordpress

mysqldemo5


## 链接之前创建的 mysql 数据库, 数据库密码是 123456
$ sudo docker run --name wordpress-1 --link mysqldemo5:db -p 8765:80 -d wordpress

### 1. --name 给 wordpress 容器命名为 wordpress-1
### 2. --link 链接到之前创建的数据库容器 mysqldemo5, 并且更名为 db
### 3. -d 后台运行.
### 4. wordpress 是镜像名字, 镜像的 ID 为e492f6febf4b

$ vagrant@ubuntu-xenial:~$ sudo docker images
REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
wordpress                          latest              e492f6febf4b        24 hours ago        546MB


guest: 8765, host: 8765

47a65cfe4785

25b1885ec450

设置 Vagrantfile 中的映射关系时, 注意
1. vim 设置完保存退出
2. 在 termina 原始状态下输入 vagrant reload
3. 重新启动 docker 时, 要先启动 mysql 容器,再启动 wordpress 容器.因为彼此依存关系

III. Mongodb

MongoDB Compass

一些坑

1. 遇到报错


## 使用 docker pull 命令遇到报错:
$ vagrant@ubuntu-xenial:~$ sudo docker pull mysql:5.7.31
Error response from daemon: Get https://registry-1.docker.io/v2/: dial 
tcp: lookup registry-1.docker.io on 10.0.2.3:53: 
read udp 10.0.2.15:46077->10.0.2.3:53: i/o timeout


解决办法:


## 使用 root 权限更改 host 文件

$ vi /etc/resolv.conf

## 增加或修改为下面一行地方内容
## nameserver 8.8.8.8      ### 我是增加了这条.


2. 从非官方仓库下载镜像的时候,有时候会提示“Error:Invalid registry endpoint https://dl.dockerpool.com:5000/v1......”,这是为什么?


## Docker从1.3.0版本以后,加强了对镜像安全的验证,需要手动添加对非官方仓库的信任。
编辑Docker配置文件,在其中添加:
DOCKER_OPTS="--insecure-registry dl.dockerpool.com:5000"
之后,重启Docker服务即可。


23节测试

3. docker 无法启动时排错方法一:


## 运行容器报错
$ root@ubuntu-xenial:/home/vagrant# sudo docker run 718a6da099d8 -d -p 3306:3306
2020-09-04 05:26:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-09-04 05:26:42+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
	command was: mysqld -d -p 3306:3306 --verbose --help
	2020-09-04T05:26:42.830556Z 0 [ERROR] mysqld: unknown option '-d'
2020-09-04T05:26:42.832894Z 0 [ERROR] Aborting

## 通过 log 查找问题所在
$ root@ubuntu-xenial:/home/vagrant# sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                    NAMES
d2b387f9433d        718a6da099d8        "docker-entrypoint.s…"   38 seconds ago      Exited (1) 37 seconds ago                            serene_joliot

$ sudo docker logs d2b387f9433d
2020-09-04 05:26:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-09-04 05:26:42+00:00 [ERROR] [Entrypoint]: mysqld failed while attempting to check config
	command was: mysqld -d -p 3306:3306 --verbose --help
	2020-09-04T05:26:42.830556Z 0 [ERROR] mysqld: unknown option '-d'
2020-09-04T05:26:42.832894Z 0 [ERROR] Aborting

### log里说 -d 参数错误. 发现参数的位置是有讲究的

$ sudo docker run -p 3306:3306 -d 718a6da099d8 ### 可以运行
$ sudo docker run 718a6da099d8 -d -p 3306:3306 ### 则报错

 sudo docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d 718a6da099d8


4. 持续观察容器的 log 输出


$ sudo docker logs -f d4ee3ed775ad


5. 一个结论: 貌似是错误结论...因为新的发现是 vagrant 这个虚拟机的本地目录 /tmp/mysqldemo 和 启动的容器 /var/lib/mysql 是一致的, 包括内容一致.

vagrant up 登录的界面, 它的根目录, 就是mac 电脑本机的根目录.
然而, 在 ubuntu 界面中, /tmp/mysqldemo 有一堆不知出处的文件, 是mysql系统的.
但是本机 mac 电脑查看 /tmp/mysqldemo 中, 空的, 空的,空的.


## 证据:
$ vagrant@ubuntu-xenial:/tmp$ ls -al
total 32
drwxrwxrwt  8 root root 4096 Sep  4 07:22 .
drwxr-xr-x 24 root root 4096 Sep  4 06:36 ..
drwxrwxrwt  2 root root 4096 Sep  4 06:36 .ICE-unix
drwxrwxrwt  2 root root 4096 Sep  4 06:36 .Test-unix
drwxrwxrwt  2 root root 4096 Sep  4 06:36 .X11-unix
drwxrwxrwt  2 root root 4096 Sep  4 06:36 .XIM-unix
drwxrwxrwt  2 root root 4096 Sep  4 06:36 .font-unix
drwxr-xr-x  5  999 root 4096 Sep  4 07:01 mysqldemo  ### 创建时间为 7:01
$ vagrant@ubuntu-xenial:/tmp$ date
Fri Sep  4 07:25:08 UTC 2020                    ### ubuntu 系统时间当时为 7:25


6. wordpress 最终可以登陆, 但是无法登陆 mysql 数据库.

实验了 47a65cfe4785--容器 id, mysqldemo5, db 作为数据库名,

账户root, 密码 123456 都可以登录到 mysql 的数据里, 但是不能登陆 wordpress 的 mysql 数据库.