Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)
Posted 小熊嗑代码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)相关的知识,希望对你有一定的参考价值。
Docker系列文-----Docker三大核心概念以及实战(nginx与mysql)(2)
Docker三大核心概念
一.镜像(Image)
镜像是Docker运行容器的前提。Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
- Docker镜像类似于虚拟机镜像,可以将它理解为一个只读的模板。
- 一个镜像可以包含一个基本的操作系统环境。
- 官方的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的镜像
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
如上图所示
- root 执行的是grep命令 不计入真正的MySQL服务
- mysql执行的是本地(虚拟机)的MySQL服务
- 而systemd+执行的则是虚拟机产生的MySQL服务
在Docker服务启动的时候,虽然你的防火墙是关闭的,但是Docker服务会往你的防火墙规则(Iptables)里写入一些规则,这时候不要重启防火墙,否则后面的操作会报错,如果报错,需要清除防火墙规则,然后重启Docker服务则可以解决问题
以上是关于Docker系列文-----Docker三大核心概念以及实战(nginx与MySQL)的主要内容,如果未能解决你的问题,请参考以下文章