Docker基础学习
Docker容器的认识
- Docker是基于Go语言实现的云开源项目。
- Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个web应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。
- Linux容器技术的出现就解决了这样的一个问题,而Docker就是在它的基础上发展过来的。将应用打成镜像,通过镜像成为运行在Docker容器上面的实例,而Docker容器在任何操作系统上都是一致的,这就实现了跨平台、跨服务器。只需要一次配置好环境,换到别的机子上就可以一键部署好,大大简化了操作。
- Docker必须部署在Linux内核的系统上,如果其他系统想要安装Docker就必须安装一个虚拟的Linux环境才行,所以先要学习Linux操作系统,再来学习Docker,这样才能事半功倍哦。
Docker的安装
点击这里进入Docker的官网,或者点击这里进入Docker hub(安装docker镜像的仓库),在CentOS7上安装Docker,参考Docker官网的官方文档操作
前提条件
在Linux操作系统上安装Docker,使用CentOS7发行版的Linux系统,目前CentOS7放行版中的内核支持Docker,若Docker想要运行CentOS7(64-bit)上,要求系统为64位、Linux内核版本为3.8以上,最好参考官方帮助文档,十分详细。
- 查看CentOS7的内核命令
- Docker三要素:
- 镜像(image):docker镜像就好比是一个模块,可以通过这个模块来创建容器服务,tomcat镜像===>run===>tomcat01容器(提供服务器),提供这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
- 容器(container):Docker利用容器技术,独立运行一个或者一个组的应用,通过镜像来创建的。启动、停止、删除、基本命令!目前就可以把这个容器理解为就是一个简易的Lunux系统。
- 仓库(repository):仓库就是存放镜像的地方,仓库分为公有和私有仓库,如:Docker Hub(国外的),阿里云(国内的),可以通过配置阿里云国内的镜像加速器进行提速。
yum安装gcc
使用Linux命令yum安装gcc程序,以管理员的身份安装
- yum -y install gcc
- yum -y install gcc-c++
安装所需要的软件包
命令:yum install -y yum-utils
设置镜像仓库
推荐使用阿里云国内仓库,不建议使用国外官网仓库。
命令: yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新软件包索引
命令:yum makecache fast
安装Docker引擎
命令:yum -y install docker-ce docker-ce-cli containerd.io
检查docker安装
查看版本
命令:docker version
启动服务
命令:systemctl start docker
查看状态
命令:systemctl status docker
hello-world
命令:docker run hello-world
阿里云镜像加速
点击这里进入阿里云官网注册账号,找到容器镜像服务,创建个人实例,根据文档命令进行操作配置即可,最后通过命令systemctl status docker查看docker状态,再次执行docker run hello-world命令,若无报错,命令行输出Hello from Docker!即为成功配置成功。
Docker比VM快?
Docker容器 | 虚拟机(VM) | |
---|---|---|
操作系统 | 与宿主机共享OS | 宿主机OS上运行虚拟机OS |
存储大小 | 镜像小,便于存储与运输 | 镜像庞大(vmdk、vdi等) |
运行性能 | 几乎无额外的性能损失 | 操作系统额外的CPU、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速、秒级 | 较慢、10s以上 |
卸载docker
命令 | 含义 |
---|---|
systemctl stop docker | 停止docker服务命令 |
yum remove dockers-ce docker-ce-cli containerd.io | 卸载docker客户端程序命令 |
rm -rf /var/lib/docker | 删除docker目录目录 |
rm -rf /var/lib/containerd | 删除containerd目录 |
Docker基础命令
具体的命令参考Docker官方文档,点击这里进入…. 下面是常用的命令简略笔记
帮助启动类命令
命令 | 含义 |
---|---|
systemctl start docker | 启动docker服务 |
systemctl stop docker | 停止docker服务 |
systemctl status docker | 查看docke状态 |
systemctl enable docker | 开机自启docker |
docker info | 查看docker信息 |
docker [具体命令] –help | docker帮助文档,“具体命令”是可选参数,若不指定,则显示全部 |
镜像命令
命令 | 含义 | 参数/说明 |
---|---|---|
docker images [-a,-q] | 列出本机主机上的镜像,参数 | -a:列出本地所有镜像(含历史);-q:只列出镜像的ID |
docker search [–limit x]镜像名称 | 查找镜像 | –limit:只列出N个镜像,默认是25个 ; x:列出的镜像个数 |
docker pull 镜像名字[:TAG] | 下载镜像 | [:TAG]:版本号,若不填写该参数,则下载最新的版本,例如:docker pull redis:6.0.8,下载redis的6.0.8版本 |
docker system df [OPTIONS] | 查看镜像/容器/数据卷所占空间 | [OPTIONS]:-v:显示空间使用的详细信息 |
docker rmi -f 镜像名字/ID | 删除镜像 | -f:可选参数,强制删除 ;docker rmi -f $(docker images -qa):该命令是强制删除全部镜像操作,谨慎操作 |
容器命令
说明:我们有了镜像才可以创建容器,linux,下载一个centos镜像来测试学习,相当于在Vmware虚拟机CentOS7里再下载一个容器centos镜像
命令:docker pull centos
命令 | 说明 |
---|---|
docker run [可选参数] IMAGE | 启动容器,–name:给容器起别名,用来区分容器;-d:后台方式运行;-it:使用交互式运行,进入容器查看内容;-P:指定容器的端口;-p:随机指定端口;IMAGE:必须的参数,如: docker run -it centos /bin/bash,其中IMAGE就是/bin/bash |
docker ps [可选参数] | 列出当前正在运行的容器,-a:列出当前正在运行的容器+历史运行过的容器;-n=?:显示最近创建的容器;-q:显示容器的编号 |
exit/ctrl+p+q | 停止退出容器/不停止容器直接退出,exit:是一个命令;ctrl+p+q:是一个快捷键 |
docker rm [-f] 容器ID | 删除容器,-f:强制删除 |
docker start 容器ID | 启动容器 |
docker stop 容器ID | 停止容器 |
docker restart 容器ID | 重启容器 |
docker kill 容器ID | 强制停止当前容器 |
commit命令
命令:docker commit -m=”描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]
例子:docker commit -m=”mysql8.0版本” -a=”guangzai” fcbfa3e8efc5 yuan/mysql:8.0
常用其他命令
命令 | 说明 |
---|---|
docker logs [OPTIONS] 容器ID | 查看日志,参数:-tf:显示日志;–tail number:要显示多少条日志 |
docker top 容器ID | 查看进程 |
docker inspect 容器ID | 查看镜像的元数据 |
docker exec -it 容器ID [/bin/bash] | 进入当前正在运行的容器,进入容器后开启一个新的终端,可以在里面操作 |
docker attach 容器ID | 进入容器正在运行的终端,不会启动新的进程 |
docker cp 容器ID:容器内的路径 目的地的主机路径 | 从容器内拷贝文件到主机上 |
小结
案例练习
部署Nginx
搜索:docker search nginx,也可以在Docker hub官网上搜索
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[root@centos ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 17982 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 183
bitnami/nginx Bitnami nginx Docker Image 150 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 75
privatebin/nginx-fpm-alpine PrivateBin running on an Nginx, php-fpm & Al… 73 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 23 [OK]
rancher/nginx-ingress-controller 11
kasmweb/nginx An Nginx image based off nginx:alpine and in… 4
ibmcom/nginx-ingress-controller Docker Image for IBM Cloud Private-CE (Commu… 4
bitnami/nginx-ldap-auth-daemon 3
bitnami/nginx-exporter 3
circleci/nginx This image is for internal use 2
rancher/nginx 2
rancher/nginx-ingress-controller-defaultbackend 2
vmware/nginx 2
rapidfort/nginx RapidFort optimized, hardened image for NGINX 2
vmware/nginx-photon 1
bitnami/nginx-intel 1
ibmcom/nginx-ppc64le Docker image for nginx-ppc64le 0
ibmcom/nginx-ingress-controller-ppc64le Docker Image for IBM Cloud Private-CE (Commu… 0
rapidfort/nginx-official RapidFort optimized, hardened image for NGIN… 0
rapidfort/nginx-ib RapidFort optimized, hardened image for NGIN… 0
rancher/nginx-ssl 0
rancher/nginx-conf 0
continuumio/nginx-ingress-ws 0下载:docker pull nginx,拉取镜像
1
2
3
4
5
6[root@centos ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest查看:docker images,查看容器镜像是否下载成功
1
2
3[root@centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 13 months ago 141MB运行:docker run -d –name nginx01 -p 7788:80 nginx
1
2[root@centos ~]# docker run -d --name nginx01 -p 7788:80 nginx
8c8ce0a9b6dda25fe0f14826a9a20030dd9fe9f2db5ee81b431e622ce1c23353查看:docker ps,查看正在运行的容器镜像
1
2
3[root@centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
59bfb10dc565 nginx "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:7788->80/tcp, :::7788->80/tcp nginx01测试:curl localhost:7788,在本机终端测试访问
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24[root@centos ~]# curl localhost:7788
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>进入:docker exec -it nginx01 /bin/bash,进入nginx容器,查看文件等操作
1
2
3
4[root@centos ~]# docker exec -it nginx01 /bin/bash
root@59bfb10dc565:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@59bfb10dc565:/#访问:自己linux的IP:7788,在浏览器访问nginx页面,如我自己的:192.168.88.88:7788
1
2
3
4
5
6
7
8
9
10下面就是访问成功后的页面展示文字,nginx的欢迎界面
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.停止:docker stop nginx容器ID
1
2[root@centos ~]# docker stop 8c8ce0a9b6dd
8c8ce0a9b6dd
部署Tomcat
搜索Tomcat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[root@centos ~]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 3471 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 101 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 47 [OK]
arm32v7/tomcat Apache Tomcat is an open source implementati… 12
arm64v8/tomcat Apache Tomcat is an open source implementati… 8
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 7 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 6
eclipse/rdf4j-workbench Dockerfile for Eclipse RDF4J Server and Work… 6
jelastic/tomcat An image of the Tomcat Java application serv… 4
oobsri/tomcat8 Testing CI Jobs with different names. 2
cfje/tomcat-resource Tomcat Concourse Resource 2
chenyufeng/tomcat-centos tomcat基于centos6的镜像 1 [OK]
appsvc/tomcat 1
ppc64le/tomcat Apache Tomcat is an open source implementati… 1
eclipse/alpine_jdk8 Based on Alpine 3.3. JDK 1.8, Maven 3.3.9, T… 1 [OK]
semoss/docker-tomcat Tomcat, Java, Maven, and Git on top of debian 0 [OK]
tomcatengineering/pg_backup_rotated Clone of martianrock/pg_backup_rotated but w… 0
softwareplant/tomcat Tomcat images for jira-cloud testing 0 [OK]
tomcat2111/papercut-mf PaperCut MF Application Server 0
tomcat0823/auto1 0
secoresearch/tomcat-varnish Tomcat and Varnish 5.0 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementati… 0
misolims/miso-base MySQL 5.7 Database and Tomcat 8 Server neede… 0
eclipse/hadoop-dev Ubuntu 14.04, Maven 3.3.9, JDK8, Tomcat 8 0 [OK]
wnprcehr/tomcat 0下载Tomcat10.0版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15[root@centos ~]# docker pull tomcat:10.0
10.0: Pulling from library/tomcat
0e29546d541c: Pull complete
9b829c73b52b: Pull complete
cb5b7ae36172: Pull complete
6494e4811622: Pull complete
668f6fcc5fa5: Pull complete
dc120c3e0290: Pull complete
8f7c0eebb7b1: Pull complete
77b694f83996: Pull complete
0f611256ec3a: Pull complete
4f25def12f23: Pull complete
Digest: sha256:9dee185c3b161cdfede1f5e35e8b56ebc9de88ed3a79526939701f3537a52324
Status: Downloaded newer image for tomcat:10.0
docker.io/library/tomcat:10.0查看Tomcat容器是否下载完成
1
2
3
4[root@centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 13 months ago 141MB
tomcat 10.0 fb5657adc892 13 months ago 680MB运行Tomcat服务
注意:若是较高版本的tomcat会报404未找到的错误!!!这是正常的现象,不是自己的操作问题哦!!!可以查看下面的解决方案
1
2[root@centos ~]# docker run -d -p 2333:8080 --name tomcat10 tomcat:10.0
020c977bbcc3324f3b87d7c84231918cafe2d2085cd5b28ae7c501c065a40b7c解决Tomcat无法访问的问题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53访问Tomcat时会报404的错误
HTTP状态 404 - 未找到
类型 状态报告
描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
Apache Tomcat/10.0.14
停止tomcat服务
[root@centos ~]# docker stop 020c977bbcc3
020c977bbcc3
进入Tomcat容器中修改webapp文件,就是因为该文件为空或者不存在所导致404错误
并且tomcat里新增了一个文件webapps.dist
方式一:我们只需要把该文件改名为webapp即可
方式二:我们也可以把webapps.dist文件复制到webapp中也行
两种方式的原理是一致的
进入tomcat容器
[root@centos ~]# docker exec -it tomcat10 /bin/bash
root@95606dac2868:/usr/local/tomcat# ls
BUILDING.txt CONTRIBUTING.md LICENSE NOTICE README.md RELEASE-NOTES RUNNING.txt bin conf lib logs native-jni-lib temp webapps webapps.dist work
root@95606dac2868:/usr/local/tomcat# ls -l
total 132
-rw-r--r--. 1 root root 18994 Dec 2 2021 BUILDING.txt
-rw-r--r--. 1 root root 6210 Dec 2 2021 CONTRIBUTING.md
-rw-r--r--. 1 root root 60269 Dec 2 2021 LICENSE
-rw-r--r--. 1 root root 2333 Dec 2 2021 NOTICE
-rw-r--r--. 1 root root 3378 Dec 2 2021 README.md
-rw-r--r--. 1 root root 6905 Dec 2 2021 RELEASE-NOTES
-rw-r--r--. 1 root root 16517 Dec 2 2021 RUNNING.txt
drwxr-xr-x. 2 root root 4096 Dec 22 2021 bin
drwxr-xr-x. 1 root root 22 Jan 27 09:21 conf
drwxr-xr-x. 2 root root 4096 Dec 22 2021 lib
drwxrwxrwx. 1 root root 80 Jan 27 09:21 logs
drwxr-xr-x. 2 root root 159 Dec 22 2021 native-jni-lib
drwxrwxrwx. 2 root root 30 Dec 22 2021 temp
drwxr-xr-x. 2 root root 6 Dec 22 2021 webapps
drwxr-xr-x. 7 root root 81 Dec 2 2021 webapps.dist
drwxrwxrwx. 2 root root 6 Dec 2 2021 work
root@95606dac2868:/usr/local/tomcat# cd webapps.dist
root@95606dac2868:/usr/local/tomcat/webapps.dist# ls
ROOT docs examples host-manager manager
root@95606dac2868:/usr/local/tomcat/webapps.dist# cd ..
root@95606dac2868:/usr/local/tomcat# cd webapps
root@95606dac2868:/usr/local/tomcat/webapps# ls
root@95606dac2868:/usr/local/tomcat/webapps# cd ..
使用Linux操作系统的cp命令对webapps.dist进行拷贝到webapps中去
root@95606dac2868:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@95606dac2868:/usr/local/tomcat# cd webapps
root@95606dac2868:/usr/local/tomcat/webapps# ls
ROOT docs examples host-manager manager
最后重新刷新一下tomcat网页,就可以看到tomcat首页了
容器数据卷
概念
卷就是目录或文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性。
卷的目的就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在删除容器时删除其挂载的容器卷。
命令
docker run -it –privileged=true -v/宿主机绝对路径目录:/容器内目录 镜像名
作用
将运用与运行的环境打包成镜像,run后形成容器实例运行,但是我们对数据的要求希望是持久化的
docker容器产生的数据,如果不备份,那么当容器实例删除后,容器内的数据自然也就没有了
为了能够保存数据载docker中我们使用卷
特点
- 数据卷可在容器之间共享或重用数据
- 卷中的更该可以直接实时生效
- 数据卷中的更改不会包含在镜像的更新中
- 数据卷的生命周期一直持续到没有容器使用它为止
案例(mysql镜像)
搜索MySQL镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27[root@centos ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 13730 [OK]
mariadb MariaDB Server is a high performing open sou… 5240 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 726 [OK]
percona Percona Server is a fork of the MySQL relati… 599 [OK]
databack/mysql-backup Back up mysql databases to... anywhere! 80
bitnami/mysql Bitnami MySQL Docker Image 80 [OK]
linuxserver/mysql-workbench 48
ubuntu/mysql MySQL open source fast, stable, multi-thread… 41
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 38
circleci/mysql MySQL is a widely used, open-source relation… 28
google/mysql MySQL server for Google Compute Engine 22 [OK]
rapidfort/mysql RapidFort optimized, hardened image for MySQL 14
bitnami/mysqld-exporter 4
ibmcom/mysql-s390x Docker image for mysql-s390x 2
vitess/mysqlctld vitess/mysqlctld 1 [OK]
newrelic/mysql-plugin New Relic Plugin for monitoring MySQL databa… 1 [OK]
hashicorp/mysql-portworx-demo 0
rapidfort/mysql-official RapidFort optimized, hardened image for MySQ… 0
mirantis/mysql 0
docksal/mysql MySQL service images for Docksal - https://d… 0
rapidfort/mysql8-ib RapidFort optimized, hardened image for MySQ… 0
cimg/mysql 0
eclipse/mysql Mysql 5.7, curl, rsync 0 [OK]
drud/mysql 0
silintl/mysql-backup-restore Simple docker image to perform mysql backups… 0 [OK]下载mysql镜像(这里我下载的是8.0版本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@centos ~]# docker pull mysql:8.0
8.0: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709
Status: Downloaded newer image for mysql:8.0
docker.io/library/mysql:8.0查看下载的MySQL镜像
1
2
3
4
5[root@centos ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 605c77e624dd 13 months ago 141MB
tomcat 10.0 fb5657adc892 13 months ago 680MB
mysql 8.0 3218b38490ce 13 months ago 516MB运行MySQL,设置相关的配置,挂载数据卷,环境配置等,进入MySQL容器添加数据,注意,当插入的数据有中文时,会乱码,原因是该MySQL的字符集不是UTF-8,需要设置成UTF-8即可,通过命令
show variables like 'character%';
进行查看,然后切换到卷的conf目录,添加文件my.cnf,文件里填写配置好字符集utf8即可,具体操作看下面。。。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140# -d:后台运行
# -p:端口映射
# -v:卷挂载
# -e:环境配置
# --name:容器别名
[root@centos ~]# docker run -d -p 3333:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql8.0 mysql:8.0
24568c28a9d18237f7177647a3d8828dd4956cfe482683d955e703aa1bd4dee2
[root@centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24568c28a9d1 mysql:8.0 "docker-entrypoint.s…" 29 seconds ago Up 28 seconds 33060/tcp, 0.0.0.0:3333->3306/tcp, :::3333->3306/tcp mysql8.0
[root@centos ~]# docker exec -it 24568c28a9d1 /bin/bash
root@24568c28a9d1:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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.02 sec)
mysql> create database db01;
Query OK, 1 row affected (0.02 sec)
mysql> use db01;
Database changed
mysql> create table t1(id int,name varchar(20));
Query OK, 0 rows affected (0.06 sec)
mysql> insert into t1 value(1,'guangzai');
Query OK, 1 row affected (0.02 sec)
mysql> select * from t1
-> ;
+------+----------+
| id | name |
+------+----------+
| 1 | guangzai |
+------+----------+
1 row in set (0.00 sec)
mysql> show variables like 'character%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
# 在SQLyog里手动添加了一条数据:id:7,name:光仔
mysql> select *from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | guangzai |
| 7 | ?? |
+------+----------+
2 rows in set (0.00 sec)
# 退出MySQL容器,执行如下命令,新增文件,填写相应内容配置
[root@centos ~]# cd /home/mysql/conf
[root@centos conf]# ls
[root@centos conf]# vim my.cnf
[root@centos conf]# cat my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
# 重启MySQL容器服务,重新执行即可
[root@centos conf]# docker restart mysql8.0
mysql8.0
[root@centos conf]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f0159bda066 mysql:8.0 "docker-entrypoint.s…" 34 minutes ago Up 44 seconds 33060/tcp, 0.0.0.0:3333->3306/tcp, :::3333->3306/tcp mysql8.0
[root@centos conf]# docker exec -it 3f0159bda066 /bin/bash
root@3f0159bda066:/# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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> use db01
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
# 这个就是修改字符集后的中文显示不乱码
mysql> SHOW VARIABLES LIKE 'character%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | utf8mb3 |
| character_set_connection | utf8mb3 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb3 |
| character_set_server | utf8mb3 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.00 sec)
# 重新查询数据
mysql> select * from t1;
+------+----------+
| id | name |
+------+----------+
| 1 | guangzai |
| 7 | 光仔 |
+------+----------+
2 rows in set (0.01 sec)打开第三方可视化视图软件MySQL软件(SQLyog、Navicat)进行连接MySQL,建立新的连接,其中连接的SQL主机地址可通过
ifconfig
命令进行查看,如果MySQL的版本是5.7以上的,会报一个2058的错误,原因是MySQL的密码加密方式变了,由于我们下载的是MySQL8.0的版本,所以我们只需要在mysql容器中执行ALTER USER ‘root’@’%’ IDENTIFIED WITH mysql_native_password BY 'password';
(注意分号要加上)改代码即可,其中password 是你自己设置的root密码,之后就可以在MySQL图形化界面进行操作MySQL数据即可,如下图所示1
2mysql> ALTER USER root@'%' IDENTIFIED WITH mysql_native_password BY 'root';
Query OK, 0 rows affected (0.01 sec)删除MySQL8.0容器,但它并没有把数据删除掉,仍然保留在卷中,相当于是一个备份吧,防止误操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48[root@centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
24568c28a9d1 mysql:8.0 "docker-entrypoint.s…" 43 minutes ago Up 43 minutes 33060/tcp, 0.0.0.0:3333->3306/tcp, :::3333->3306/tcp mysql8.0
[root@centos ~]# docker stop 24568c28a9d1
24568c28a9d1
[root@centos ~]# docker rm -f 24568c28a9d1
24568c28a9d1
[root@centos ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@centos ~]# cd /home
[root@centos home]# ls
mysql user
[root@centos home]# cd mysql
[root@centos mysql]# ll
总用量 4
drwxr-xr-x. 2 root root 6 1月 27 18:02 conf
drwxr-xr-x. 7 polkitd root 4096 1月 27 19:56 data
[root@centos mysql]# cd data
[root@centos data]# ll
总用量 185760
-rw-r-----. 1 polkitd input 56 1月 27 19:12 auto.cnf
-rw-r-----. 1 polkitd input 3116921 1月 27 19:12 binlog.000001
-rw-r-----. 1 polkitd input 1439 1月 27 19:56 binlog.000002
-rw-r-----. 1 polkitd input 32 1月 27 19:12 binlog.index
-rw-------. 1 polkitd input 1680 1月 27 19:12 ca-key.pem
-rw-r--r--. 1 polkitd input 1112 1月 27 19:12 ca.pem
-rw-r--r--. 1 polkitd input 1112 1月 27 19:12 client-cert.pem
-rw-------. 1 polkitd input 1680 1月 27 19:12 client-key.pem
drwxr-x---. 2 polkitd input 20 1月 27 19:16 db01
-rw-r-----. 1 polkitd input 196608 1月 27 19:42 #ib_16384_0.dblwr
-rw-r-----. 1 polkitd input 8585216 1月 27 19:12 #ib_16384_1.dblwr
-rw-r-----. 1 polkitd input 3883 1月 27 19:56 ib_buffer_pool
-rw-r-----. 1 polkitd input 12582912 1月 27 19:56 ibdata1
-rw-r-----. 1 polkitd input 50331648 1月 27 19:42 ib_logfile0
-rw-r-----. 1 polkitd input 50331648 1月 27 19:12 ib_logfile1
drwxr-x---. 2 polkitd input 6 1月 27 19:56 #innodb_temp
drwxr-x---. 2 polkitd input 143 1月 27 19:12 mysql
-rw-r-----. 1 polkitd input 31457280 1月 27 19:40 mysql.ibd
drwxr-x---. 2 polkitd input 8192 1月 27 19:12 performance_schema
-rw-------. 1 polkitd input 1676 1月 27 19:12 private_key.pem
-rw-r--r--. 1 polkitd input 452 1月 27 19:12 public_key.pem
-rw-r--r--. 1 polkitd input 1112 1月 27 19:12 server-cert.pem
-rw-------. 1 polkitd input 1680 1月 27 19:12 server-key.pem
drwxr-x---. 2 polkitd input 28 1月 27 19:12 sys
-rw-r-----. 1 polkitd input 16777216 1月 27 19:40 undo_001
-rw-r-----. 1 polkitd input 16777216 1月 27 19:42 undo_002
匿名和具名挂载
所有的docker容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data
,我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下都是使用具名挂载
如何确定是匿名和具名挂载
1 | -v 容器内路径 # 匿名挂载 |
扩展
1 | 通过 -v 容器内路径:ro/rw 可以改变读写权限 |
Dockerfile
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本!
通过这个脚本可以生成镜像,镜像是一层一层的,脚本是一个一个的命令(大写),每个命令都是一层!
在/home目录下创建一个docker-test-volume目录用来测试学习Dockerfile,命令为mkdir docker-test-volume
1 | 创建一个Dockerfile文件,名字可以随机,建议是Dockerfile |
Dockerfile介绍
dockerfile是用来构建docker的镜像文件!命令参数脚本!(FROM、ADD、LABLE、CMD…)
构建步骤
- 编写一个dockerfile文件
- docker build 构建一个镜像
- docker run 运行镜像
- dockr push 发布镜像(Docker hub、阿里云镜像仓库)
Dockerfile构建过程
基础知识
- 每个命令(指令)都必须是大写字母
- 执行顺序是从上到下
- 用
#
表示注释 - 每一个指令都会创建并提交一个镜像层,如下图所示
- dockerfile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件,这十分重要!!!
- DockerFile:构建文件,定义一切的步骤,源代码
- DockerImages:通过DockerFile生成的镜像,最终发布和运行产品项目
Dockerfile指令
1 | FROM #基础镜像,一切从这里开始构建,99%的镜像都是从FROM scratch开始的 |
发布自己的镜像
可以发布到Docker hub或者阿里云镜像仓库,下面是发布到Docker hub上的
在Docker hub上注册自己的账号,点击这里进入注册
确定这个账号可以登录
在我们服务器上提交自己的镜像
登录Docker hub,命令为
docker login
,账号密码登录1
2
3
4
5
6
7
8
9
10
11[root@centos tomcat]# docker login --help
Usage: docker login [OPTIONS] [SERVER]
Log in to a Docker registry.
If no server is specified, the default is defined by the daemon.
Options:
-p, --password string Password
--password-stdin Take the password from stdin
-u, --username string Username将镜像推送到Docker hub上,命令为docker push
小结
Docker网络
容器间的互联和通信以及端口映射,容器IP变动的时候可以通过服务名直接网络通信而不受到影响
理解Docker0
我们每启动一个docker容器,docker就会给docker容器分配一个IP地址,只需要安装docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!所有的容器在不指定网络的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用IP地址
查看网卡命令:ip addr,ifconfig
1 | [root@centos home]# ip addr |
常用命令
使用docker network ls命令,可查看docker网络模式命令,默认的3个网络模式(bridge、host、none),可通过docker network –help,来查询常用的命令,如:docker network + create、connect、disconnect、inspect、ls、prune、rm等命令。。。
1 | [root@centos ~]# docker network ls |
Docker微服务实战
1、构建springboot项目
使用idea软件直接新建一个springboot项目,配置好自己的环境
2、编写Dockerfile文件、写一个测试的Controller类、最后通过maven打包成jar包
3、构建镜像、运行测试
1 | 查看上传好的jar包和Dockerfile文件 |
Docker-compose
compose的初识
docker-compose是Docker官方开源的项目,负责对Docker容器集群的快速编排。
docker建议我们每一个容器中只运行一个服务,因为Docker容器本身占用资源极少,所以最好是将每个服务单独的分割开来,但是这样我们又面临一个问题?
如果我们需要同时部署好多个服务,难道要每个服务单独写一个dockerfile然后在构建镜像,构建容器,这样很费时费力,所以Docker官方提供了docker-compose多服务部署工具.
例如要实现一个Web微服务项目,除了Web容器本身,往往还需要加上后端的数据库MySQL服务容器,redis服务器,注册中心Eureka,甚至还包括负载均衡容器等等…
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的容器为一个项目(project)。
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。docker-compose解决了容器与容器之间如何管理编排的问题。
compose安装
进入docker官网按照文档进行安装,检查是否安装成功,docker-compose –version,出现版本号即为安装成功!!!
1 | [root@centos test]# curl -L https://get.daocloud.io/docker/compose/releases/download/v2.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose |
compose核心
一个文件:docker-compose.yml
两个要素
- 服务(service):一个个应用容器实例,比如订单微服务 、库存微服务、mysql容器、nginx容器、redis容器
- 工程(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件中定义
compose常用命令
- docker-compose -h:查看帮助
- docker-compose up:启动所有docker-compose服务
- docker-compose up -d:启动所有docker-compose服务并在后台运行
- docker-compose down:停止并删除容器、网络、卷、镜像
- docker-compose exec yml里面的服务器id:进入容器实例内部docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
- docker-compose ps:展示当前docker-compose编排过的运行过的所有容器
- docker-compose top:展示当前docker-compose编排过的容器进程
- docker-compose logs yml里面的服务id:查看容器输出日志
- docker-compose config:检查配置
- docker-compose config -q:检查配置,有问题才输出
- docker-compose restart:重启服务
- docker-compose start:启动服务
- docker-compose stop:停止服务
compose使用
步骤
- 编写dockerfile定义各个微服务应用并构建出对应的镜像文件
- 使用docker-compose.yml定义一个完整的业务单元,安排好整体应用中的各个容器服务
- 最后执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线
Docker可视化工具
Portainer图形化工具
Docker轻量级可视化工具Portainer,它提供了docker图形化界面,用于方便地管理Docker环境,包括单机和集群环境。
点击这里进入Portainer官网
Portainer安装
1 | [root@centos ~]# docker pull portainer/portainer |
Portainer运行
1 | [root@centos test]# docker run -d -p 8000:8000 -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer |
1 | 该命令可查看Docker详细信息,对应下面的图形化界面的数据 |
Portainer登录
首次登录需要设置admin用户和密码
- 感谢您的赞赏。