Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)

Posted 小熊嗑代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)相关的知识,希望对你有一定的参考价值。

Docker三大核心概念

一.镜像(Image)

镜像是Docker运行容器的前提。Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

  1. Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
  2. 一个镜像可以包含一个基本的操作系统环境。
  3. 官方的Docker Hub仓库以及提供了数十万个镜像供大家开放下载。
    Docker Hub网站

二.容器(Container)

Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行的一个实例。可以将其创建、启动、开始、停止、删除,而这些容器都是彼此互相隔离、互不可见的。
可以把容器看作是一个简易版的Linux系统环境(包括root用户权限、进程空间、用户空间和网络空间等)以及运行在其中的应用程序打包而成的盒子。

三.仓库(Repository)

Docker仓库类似于代码仓库,它是Docker集中存放镜像文件的场所。
一个容易与之混淆的概念是注册服务器(Registry)。实际上注册服务器是存放仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器地址,ubuntu是仓库名。

Docker的基本命令介绍

1.查看自己的docker版本

[root@sc-docker ~]# docker -v
Docker version 20.10.8, build 3967b7d

2.查看所有可以安装的docker版本

[root@sc-docker ~]# yum list docker-ce --showduplicates|sort -r
docker-ce.x86_64               3:20.10.8-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.8-3.el8                 @docker-ce-stable
docker-ce.x86_64               3:20.10.7-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.6-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.5-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.4-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.3-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.2-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.1-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.0-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:19.03.15-3.el8                docker-ce-stable 
docker-ce.x86_64               3:19.03.14-3.el8                docker-ce-stable 
docker-ce.x86_64               3:19.03.13-3.el8                docker-ce-stable 
已安装的软件包
上次元数据过期检查:0:36:19 前,执行于 2021年08月11日 星期三 10时19分27秒。
可安装的软件包

3.查看自己的Docker进程是否运行

[root@sc-docker ~]# ps aux|grep docker
root       12879  0.0  2.3 1517348 88696 ?       Ssl  06:08   0:09 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root       15775  0.0  0.0  12324  1044 pts/0    S+   10:58   0:00 grep --color=auto docker

dockerd:docker deamon—》docker守护进程:一直在运行的,对外提供服务的

4.查找自己所需要的镜像:

第一个显示的一定是官方库,STARS越多收藏的次数越多,有部分是个人或者企业镜像,个人也能够提交镜像至仓库

[root@sc-docker web]# docker search nginx
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        15288     [OK]       
jwilder/nginx-proxy               Automated Nginx reverse proxy for docker con…   2058                 [OK]
richarvey/nginx-php-fpm           Container running Nginx + PHP-FPM capable of…   815                  [OK]
jc21/nginx-proxy-manager          Docker container for managing Nginx proxy ho…   228                  
linuxserver/nginx                 An Nginx container, brought to you by LinuxS…   150                  
tiangolo/nginx-rtmp               Docker image with Nginx using the nginx-rtmp…   138                  [OK]
jlesage/nginx-proxy-manager       Docker container for Nginx Proxy Manager        130                  [OK]
alfg/nginx-rtmp                   NGINX, nginx-rtmp-module and FFmpeg from sou…   105                  [OK]
nginxdemos/hello                  NGINX webserver that serves a simple page co…   70                   [OK]
privatebin/nginx-fpm-alpine       PrivateBin running on an Nginx, php-fpm & Al…   56                   [OK]
nginx/nginx-ingress               NGINX and  NGINX Plus Ingress Controllers fo…   55                   
nginxinc/nginx-unprivileged       Unprivileged NGINX Dockerfiles                  46                   
staticfloat/nginx-certbot         Opinionated setup for automatic TLS certs lo…   24                   [OK]
nginx/nginx-prometheus-exporter   NGINX Prometheus Exporter for NGINX and NGIN…   19                   
schmunk42/nginx-redirect          A very simple container to redirect HTTP tra…   19                   [OK]
centos/nginx-112-centos7          Platform for running nginx 1.12 or building …   15                   
centos/nginx-18-centos7           Platform for running nginx 1.8 or building n…   13                   
flashspys/nginx-static            Super Lightweight Nginx Image                   10                   [OK]
mailu/nginx                       Mailu nginx frontend                            9                    [OK]
navidonskis/nginx-php5.6          Docker nginx + php5.6 on Ubuntu                 7                    [OK]
devilbox/nginx-stable             Devilbox's Nginx stable (based on official N…   4                    
ansibleplaybookbundle/nginx-apb   An APB to deploy NGINX                          2                    [OK]
wodby/nginx                       Generic nginx                                   1                    [OK]
arnau/nginx-gate                  Docker image with Nginx with Lua enabled on …   1                    [OK]
centos/nginx-110-centos7          Platform for running nginx 1.10 or building …   0

5.只下载镜像,不开启容器

pull 从别人那里拉取下来----》下载
push 推上去—》上传

[root@sc-docker web]# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
33847f680f63: Already exists 
5cb67864e624: Pull complete 
1a2b594783f5: Pull complete 
b30e406dd925: Pull complete 
48901e306e4c: Pull complete 
603d2b7147fd: Pull complete 
802aa684c1c4: Pull complete 
715d3c143a06: Pull complete 
6978e1b7a511: Pull complete 
f0d78b0ac1be: Pull complete 
35a94d251ed1: Pull complete 
36f75719b1a9: Pull complete 
Digest: sha256:8b928a5117cf5c2238c7a09cd28c2e801ac98f91c3f8203a8938ae51f14700fd
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest

上面默认下载最新版的MySQL,可以下载指定版本的MySQL------>mysql:tag

[root@sc-docker web]# docker pull mysql:5.7.35

6.查看自己有哪些镜像

[root@sc-docker ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 months ago   13.3kB
centos        latest    300e315adb2f   8 months ago   209MB

7.创建一个容器

注意 :create不能接-d 因为只是创建容器没有run,-d表示进程,此时进程并没有启动
创建一个容器 不启动

[root@sc-docker web]# docker create --name sc-nginx-cali-6 -p 8088:80 nginx 
ff959e6e08bcd17adc230220dd6ccf5e3180a5d92dffb1ea9ccf261a1c867ccb

8.启动容器

可以理解为:docker run = docker create + docker start
简单版:

docker run --name sc-nginx-1  -d -p 8081:80   nginx

复杂版:

docker run --name sc-nginx-1 -v /web:/usr/share/nginx/html:ro -d -p 8080:80 daocloud.io/nginx

1.–name sc-nginx-1 指定容器的名字
2.-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录(挂载)
-v /web:/usr/share/nginx/html:ro 数据卷:可以实现宿主机和容器直接的数据共享
/web 是宿主机的目录
/usr/share/nginx/html 是容器里的系统的目录的路径
ro 只读
3.-d 在后台启动一个容器进程 deamon
4.-p 端口的映射:iptables的DNAT 8080:80 访问宿主机的8080端口,转发到容器里的80端口
8080:80:访问宿主的8080端口可以转接到容器的80端口
发布:将容器的服务发布到外界
原理:dnat
5.daocloud.io/nginx 到daocloud.io网站去下载nginx的镜像

点击进入daocolud官网

9.查看正在运行的容器:

[root@sc-docker web]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED       STATUS         PORTS                                   NAMES
1bd4455d581a   daocloud.io/nginx   "/docker-entrypoint.…"   3 hours ago   Up 3 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   sc-nginx-4

接-a选项查看更全的信息 而且可以显示没有在Up状态的容器

[root@sc-docker web]# docker ps -a
CONTAINER ID   IMAGE               COMMAND                  CREATED        STATUS                    PORTS                                   NAMES
1bd4455d581a   daocloud.io/nginx   "/docker-entrypoint.…"   3 hours ago    Up 3 minutes              0.0.0.0:8080->80/tcp, :::8080->80/tcp   sc-nginx-4
7317d5762013   centos              "/bin/bash"              13 hours ago   Exited (0) 3 hours ago 

10.停止运行容器

[root@sc-docker web]# docker stop sc-nginx-4
sc-nginx-4

11.重新开启容器

[root@sc-docker web]# docker start sc-nginx-4
sc-nginx-4

12.彻底删除容器:

一个容器正在运行的时候不能够直接删除,必须stop之后才能删除

[root@sc-docker web]# docker rm sc-nginx-4
Error response from daemon: You cannot remove a running container 1bd4455d581a8db0258dde45e8b9db0eed38bb6071a563a2897bfa5466beb681. Stop the container before attempting removal or force remove

如下图所示这样为删除成功(确认结果可以用docker ps -a查看)

[root@sc-docker web]# docker rm sc-nginx-4
sc-nginx-4

13.查看容器的日志

docker logs +容器名

[root@sc-docker web]# docker logs sc-nginx-cali-1

14.查看某个容器里的进程的进程

docker top +容器名

[root@sc-docker web]# docker top sc-nginx-cali-1
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                21414               21394               0                   15:57               ?                   00:00:00            nginx: master process nginx -g daemon off;
101                 21462               21414               0                   15:57               ?                   00:00:00            nginx: worker process

15.进入容器内部

-i --interactive(相互作用的) 可以交互

-t 创建一个终端
-it 一般一起使用
进入容器内部运行/bin/bash这个命令

[root@sc-docker web]# docker exec -it sc-nginx-cali-1 /bin/bash
root@e24c5644f935:/# hostname
e24c5644f935

Nginx实战

nginx是一个web服务器软件,搭建一个自己的网站(静态)

先体验一下nginx能带来的服务

1.yum install方式安装nginx

[root@sc-docker ~]# yum install nginx -y

2.开启nginx服务并检测

[root@sc-docker ~]# ss -anplut|grep nginx
tcp     LISTEN   0        128              0.0.0.0:80            0.0.0.0:*       users:(("nginx",pid=18114,fd=8),("nginx",pid=18113,fd=8),("nginx",pid=18112,fd=8))
tcp     LISTEN   0        128                 [::]:80               [::]:*       users:(("nginx",pid=18114,fd=9),("nginx",pid=18113,fd=9),("nginx",pid=18112,fd=9))
[root@sc-docker ~]# systemctl start nginx
[root@sc-docker ~]# ps aux|grep nginx
root       18112  0.0  0.0 119156  2192 ?        Ss   11:26   0:00 nginx: master process /usr/sbin/nginx
nginx      18113  0.0  0.2 151804  7972 ?        S    11:26   0:00 nginx: worker process
nginx      18114  0.0  0.2 151804  7972 ?        S    11:26   0:00 nginx: worker process
root       18116  0.0  0.0  12324   972 pts/0    S+   11:26   0:00 grep --color=auto nginx

3.关闭防火墙和selinux,并且设置开机不要自启

[root@sc-docker ~]# setenforce 0
[root@sc-docker ~]# systemctl stop firewalld
[root@sc-docker ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@sc-docker ~]# vim /etc/selinux/config 
----------------------------------------------------
将SELINUX=enforce
修改为disabled 重启后永久生效

4.进入nginx存放网站首页的目录

[root@sc-docker ~]# cd /usr/share/nginx/html/
index.html ---》首页---》打开网站看到的第一个页面
[root@sc-docker html]# vim index.html 
--------------------------------------
可以用html语言修改这个页面 修改完什么样子之后访问此ip地址的80端口首页就是什么样子

5.测试nginx服务 访问自己虚拟机的ip

在浏览器中输入自己的ip地址:80

Docker启动nginx容器:

1.下载好nginx的镜像文件后启动容器

docker run --name sc-nginx-2 -v /web:/usr/share/nginx/html:ro -d -p 8080:80 daocloud.io/nginx
c74a86eedfce131dc2374161b101b5d98d5f60cde939d28ec012af6933af8fcc

2.查看nginx容器是否在运行

[root@sc-docker html]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED          STATUS         PORTS                                   NAMES
c74a86eedfce   daocloud.io/nginx   "/docker-entrypoint.…"   10 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   sc-nginx-2
[root@sc-docker html]# ss -anplut|grep 8080
tcp     LISTEN   0        128              0.0.0.0:8080          0.0.0.0:*       users:(("docker-proxy",pid=19021,fd=4))                                        
tcp     LISTEN   0        128                 [::]:8080             [::]:*       users:(("docker-proxy",pid=19027,fd=4))         

3.然后可以访问192.168.2.21:8080 然后里面就是访问docker的nginx的80端口

访问的是主机的/web文件 映射到docker容器的nginx下的/usr/share/nginx/html文件
如图即为成功(图上是8088端口,此例子访问8080端口即可)




MySQL实战

前提:(确保系统中都存在MySQL服务器)
centos:
yum install mariadb mariadb-server
mariadb 是客户端的软件包
ubuntu:
xiaoxiong@root:~$ sudo apt install mariadb-server
mariadb-server:提供mysql数据库的服务

Ubuntu系统:

0.小技巧tips

在Ubuntu中重新使用root用户,可以省去繁琐的sudo操作:
root@root:/home/xiaoxiong# sudo passwd root
New password: 
Retype new password: 
passwd: password updated successfully
root@root:/home/xiaoxiong# su - root

1.下载mysql的image:(ubuntu)

xiaoxiong@root:~$ sudo docker pull mysql:5.7.35

2.确保本地的mysql服务关闭

service stop mysql

3.启动容器

docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD=‘sanchuang123’ -d mysql:5.7.35 -P 3306:3306
–name:指定容器的容器名
-e :指定环境变量 MYSQL_ROOT_PASSWORD的环境变量
-d:守护进程 deamon
mysql:tag ---->tag用来指定mysql的版本
-P:端口映射 从本机的3306端口映射到docker里的3306端口

root@root:/home/xiaoxiong# docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD='sanchuang123' -d -p 3306:3306 mysql:5.7.35
9c0d35a1a1585f6358905d86f922206179231f9aea092f54d848a03fcfcdc98b

4.连接测试

root@root:/home/xiaoxiong# mysql -uroot -psanchuang123 -h 192.168.63.147 -P 3306
Welcome to the MariaDB monitor.  Commands end with ; or \\g.
Your MySQL connection id is 4
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]>

  • 测试成功

Centos8系统:

1.下载mysql镜像:

docker pull mysql:5.7.35

2.启动容器

docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD=‘sanchuang123’ -d -p 3306:3306 mysql:5.7.35

[root@sc-docker html]# docker run --name sc-mysql-1 -e MYSQL_ROOT_PASSWORD='sanchuang123' -d -p 3306:3306 mysql:5.7.35
1468f427a37bc37792f656cfb08aa46605526330e31e5027a6c50a4e79658342
[root@sc-docker html]# docker ps
CONTAINER ID   IMAGE               COMMAND                  CREATED         STATUS             PORTS                                                  NAMES
1468f427a37b   mysql:5.7.35        "docker-entrypoint.s…"   3 seconds ago   Up 2 seconds       0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   sc-mysql-1

3.访问测试

可以是其他服务器(使用另一台虚拟机来访问)
-h 指定连接服务器的ip地址

[root@sc-docker html]# mysql -h 192.168.2.21 -uroot -p'sanchuang123'
Welcome to the MariaDB monitor.  Commands end with ; or \\g.
Your MySQL connection id is 2
Server version: 5.7.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

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

MySQL [(none)]> 

如果遇到Bug、Error~

在上述命令都没有错误的情况下:
如果访问不进去,报错

 ERROR 2002 (HY000): Can't connect to MySQL server on '192.168.63.147' (115)

重启一下docker的服务再docker start刚刚的容器 80%能够修复

service docker restart

小心得:

不论是在Centos还是Ubuntu系统中,ps aux|grep mysql这个命令是可以捕捉到你使用docker容器创建的mysqld进程的
但是需要注意:

root@root:~# ps aux|grep mysql
systemd+   34414  0.0  9.8 1377300 197804 ?      Ssl  09:50   0:06 mysqld
mysql      38050  8.0  3.8 1710584 77356 ?       Ssl  11:56   0:00 /usr/sbin/mysqld
root       38134  0.0  0.0   6432   736 pts/0    S+   11:56   0:00 grep --color=auto mysql

如上图所示

  1. root 执行的是grep命令 不计入真正的MySQL服务
  2. mysql执行的是本地(虚拟机)的MySQL服务
  3. 而systemd+执行的则是虚拟机产生的MySQL服务

在Docker服务启动的时候,虽然你的防火墙是关闭的,但是Docker服务会往你的防火墙规则(Iptables)里写入一些规则,这时候不要重启防火墙,否则后面的操作会报错,如果报错,需要清除防火墙规则,然后重启Docker服务则可以解决问题



再次感谢各位看官!!!
万字长文建议收藏

以上是关于Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)的主要内容,如果未能解决你的问题,请参考以下文章

docker核心概念及基本操作

Docker 实战核心概念及常用命令

Docker 实战核心概念及常用命令

Docker容器的详解与配置

Dockerd的核心概念,镜像操作

Docker 概念及基本用法