Docker
1. 概述
基于Go语言
传统:开发——上线 两套环境 | 应用配置(开发 运维人员)
现在:发布项目(jar + (Redis Mysql jdk Es))整体带上环境打包,一个人就可以搞定
例:java -- apk -- 发布(应用商店)-- 用户使用apk -- 安装即可使用
java -- jar(环境) -- 打包项目带上环境(镜像) -- (Docker仓库:商店) -- 下载我们发布的镜像 -- 直接运行即可
Docker 是一个容器平台的领导者,应用的容器平台 思路:来自集装箱
隔离:Docker核心思想 | 打包装箱,可以将服务器利用到极致,每个容器都有自己环境
更便捷的升级和扩缩容
项目打包一个镜像,扩展 服务器A | 服务器B
2010年 容器化技术命名为 Docker
2013年 项目开源
2. 名词
镜像 Image
好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像 ==> run ==> tomcat01容器
容器 container
独立运行一个或多个应用,通过镜像来创建
启动,停止,删除等命令 (相当于 简易的linux 系统)
仓库 repository
存放镜像的地方
公有仓库
私有仓库
Docker Hub(默认国外的)
3. 安装
适用于 Linux 的 Windows 子系统没有已安装的分发版(用户名:xuety 密码:tianyun123)
利用 win10 自带的虚拟化技术Hyper-V,在虚拟机中安装 Linux内核 ,并在安装 Linux 系统中运行 Docker
查看wsl版本
PS C:\Users\11646> wsl -l -v
NAME STATE VERSION
* Ubuntu-18.04 Running 2
安装Docker软件成功界面
运行docker run hello-world ,来载入测试镜像测试
xuety@DESKTOP-69ESL5J:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:10d7d58d5ebd2a652f4d93fdd86da8f265f5318c6a73cc5b6a9798ff6d2b2e67
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
原理:开始 -> Docker本机寻找资源 -> 判断是否有 -> (没有)去DockerHub下载 -> (有)使用这个镜像运行
4. 工作原理
1.Dcoker 是一个Client-Server结构的系统,Docker的守护进程运行在主机上。通过Socker从客户端访问!
2.DockerServer接收到Docker-Client的指令,就会执行这个命令。
比VM快
新建容器的时候,有比虚拟机更少的抽象层,利用的是宿主主机的内核,vm则需要Guest OS,分级别的
5. 常用命令
1.镜像命令
docker images 查看所有本地主机上的镜像
xuety@DESKTOP-69ESL5J:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker/getting-started latest cb90f98fd791 2 weeks ago 28.8MB
hello-world latest feb5d9fea6a5 7 months ago 13.3kB
repository : 镜像的仓库源
tag:镜像的标签
可选项 -q quiet 只显示镜像id
xuety@DESKTOP-69ESL5J:~$ docker images -q
cb90f98fd791
feb5d9fea6a5
2.搜索命令
xuety@DESKTOP-69ESL5J:~$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12461 [OK]
mariadb MariaDB Server is a high performing open sou… 4801 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 922 [OK]
percona Percona Server is a fork of the MySQL relati… 575 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 512 [OK]
可选项 --filter 搜索过滤
xuety@DESKTOP-69ESL5J:~$ docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12461 [OK]
mariadb MariaDB Server is a high performing open sou… 4801 [OK]
3.下载命令
xuety@DESKTOP-69ESL5J:~$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
4be315f6562f: Pull complete
96e2eb237a1b: Pull complete
8aa3ac85066b: Pull complete
ac7e524f6c89: Pull complete
f6a88631064f: Pull complete
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
分层下载,docker image的核心 联合文件系统
docker.io/library/mysql:latest #真实地址 <=> docker pull mysql
可选项 --a 搜索版本
xuety@DESKTOP-69ESL5J:~$ docker pull mysql:5.7
5.7: Pulling from library/mysql
4be315f6562f: Already exists
96e2eb237a1b: Already exists
4.删除命令 (容器id)
xuety@DESKTOP-69ESL5J:~$ docker rmi -f cb90f98fd791
Untagged: docker/getting-started:latest
Untagged: docker/getting-started@sha256:b558be874169471bd4e65bd6eac8c303b271a7ee8553ba47481b73b2bf597aae
Deleted: sha256:cb90f98fd791dd49f09903cef3eb2245646b4d76b093825ea78e0f7bb8fb3403
删除所有 docker rmi -f $(docker images -aq)
5.容器命令
docker pull centos
新建容器并启动
docker run [可选参数] image
–name 容器名字
-d 后台运行
-it 进入容器看内容
-p 指定端口
-P 随机指定端口
xuety@DESKTOP-69ESL5J:~$ docker run -it centos
[root@c2778e795e98 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
查看正在运行的容器
xuety@DESKTOP-69ESL5J:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0bf51f37a7c centos "/bin/bash" 8 seconds ago Up 8 seconds dreamy_franklin
查看正在运行和最近创建过的容器
xuety@DESKTOP-69ESL5J:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0bf51f37a7c centos "/bin/bash" 2 minutes ago Up 2 minutes dreamy_franklin
c2778e795e98 centos "/bin/bash" 7 minutes ago Exited (127) 3 minutes ago pedantic_hamilton
3285712cbeb4 hello-world "/hello" 24 hours ago Exited (0) 24 hours ago sharp_spence
e33665d9a257 hello-world "/hello" 24 hours ago Exited (0) 24 hours ago dreamy_goodall
70f3b4e5a5ec hello-world "/hello" 25 hours ago Exited (0) 25 hours ago zen_galile
#可选
-n 显示最近n个创建的容器
-q 只显示id
xuety@DESKTOP-69ESL5J:~$ docker ps -a -n=2
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a0bf51f37a7c centos "/bin/bash" 6 minutes ago Up 6 minutes dreamy_franklin
c2778e795e98 centos "/bin/bash" 11 minutes ago Exited (127) 8 minutes ago pedantic_hamilton
xuety@DESKTOP-69ESL5J:~$ docker ps -aq
a0bf51f37a7c
c2778e795e98
3285712cbeb4
e33665d9a257
6.退出主机命令
exit/Ctrl + D 退出容器停止
Ctrl + P + Q 退出不停止
7.删除容器
docker rm 容器id
递归删除全部
xuety@DESKTOP-69ESL5J:~$ docker rm -f $(docker ps -aq)
00366b8ee60f
63ae0a434062
a0bf51f37a7c
c2778e795e98
3285712cbeb4
e33665d9a257
70f3b4e5a5ec
a98c05908208
xuety@DESKTOP-69ESL5J:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8.启动容器
docker start 容器id
docker stop 容器id
docker kill 容器id
后台运行 docker run -d 容器id
##发现容器停止了,原因:必须有一个前台进程,否则docker发现没有进程就会停止
9.查看日志
docker logs -tf --tail number 容器id
docker run -d centos /bin/sh -c while true;do echo ceshihaha;sleep 1;done" //-c 写命令
10.查看容器中进程
xuety@DESKTOP-69ESL5J:~$ docker top d30440affc3d
UID PID PPID C STIME TTY
TIME CMD
root 1173 1152 0 02:02 ?
uid 用户id
pid 进程id
ppid 父级id
11.查看容器元数据
docker inspect 容器id
xuety@DESKTOP-69ESL5J:~$ docker inspect d30440affc3d
[
{
"Id": "d30440affc3df1c8f212061224ea16490eeba600b1d444afceb419d961a30372",
"Created": "2022-05-05T02:02:35.309847153Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1173,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-05-05T02:02:35.967177485Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
"ResolvConfPath": "/var/lib/docker/containers/d30440affc3df1c8f212061224ea16490eeba600b1d444afceb419d961a30372/resolv.conf",
12查看top
xuety@DESKTOP-69ESL5J:~$ docker top ac280460fd27
UID PID PPID C STIME TTY
TIME CMD
root 1387 1368 0 09:24 ?
00:00:00 /bin/bash
13.安装nginx
docker pull nginx 指定版本
xuety@DESKTOP-69ESL5J:~$ docker pull nginx:1.21-perl
1.21-perl: Pulling from library/nginx
a2abf6c4d29d: Pull complete
156dbdbdfee7: Pull complete
eabf75df4b6b: Pull complete
3a1deb1b35ba: Pull complete
6ac5d2a1a1fd: Pull complete
f882d95ac1a6: Pull complete
Digest: sha256:88100001b6475fcff4b57cff046849f7d3a83bd3f80169a978b06f3346f35f63
Status: Downloaded newer image for nginx:1.21-perl
docker.io/library/nginx:1.21-perl
查看指定镜像 ls 容器
xuety@DESKTOP-69ESL5J:~$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 4 months ago 141MB
启动nginx
-p 8080:80
xuety@DESKTOP-69ESL5J:~$ docker run --name nginx_1 -p 8080:80 -d nginx_1
ff151f5c734a5ba95abe3d7e34bfa65d2ae7b8c8bcb412faec209c011f095c99
–name 取别名
-p 端口暴露 公网ip:docker内部ip
启动效果图
查看nginx 配置目录
xuety@DESKTOP-AL0EOR2:/$ docker exec -it mynginx /bin/bash
root@f9d0a73edbbf:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f9d0a73edbbf:/# cd /etc/nginx/
root@f9d0a73edbbf:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
// 把容器内对应的配置项复制到刚才的目录下
此处用cmd操作,用unbutu操作不了
docker cp mynginx:/etc/nginx/nginx.conf D:\DockerContainer\nginx\conf
docker cp mynginx:/etc/nginx/conf.d/default.conf D:\dockerContainer\nginx\conf.d\
docker cp mynginx:/usr/share/nginx/html/index.html D:\dockerContainer\nginx\www
docker cp mynginx:/var/log/nginx D:\dockerContainer\nginx\logs
关闭 重新创建容器
docker run --name mynginx -p 8080:80 -v D:\dockerContainer\nginx\conf:/etc/nginx/conf -v D:\dockerContainer\nginx\conf.d:/etc/nginx/conf.d -v D:\dockerContainer\nginx\logs:/var/log/nginx -v D:\dockerContainer\nginx\www:/usr/share/nginx/html -d nginx
nginx+php 运行
xuety@DESKTOP-AL0EOR2:/$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fce222c8eb68 php:7.4.29-fpm "docker-php-entrypoi…" 5 seconds ago Up 4 seconds 0.0.0.0:9001->9000/tcp myphp
97f8745ee720 nginx "/docker-entrypoint.…" 26 minutes ago Up 26 minutes 0.0.0.0:8080->80/tcp mynginx
启动成功截图
配置nginx.conf.d
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.php index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# docker inspect myphp 172.17.0.2
location ~ \.php$ {
root html;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
修改hosts文件
root@782266ccece2:/etc# cat hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2 php 74ca817ed935 myphp
172.17.0.3 782266ccece2
127.0.0.1 www.test.com
启动mysql
docker run --name mysql -p 3307:3306 -v D:\dockerContainer\mysql\conf:/etc/mysql -v D:\dockerContainer\mysql\mysqldata:/var/lib/mysql -v D:\dockerContainer\mysql\logs:/logs -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.38
14.更改doker名称
https://www.jb51.net/article/200120.htm