一,Docker安装Nginx
1,搜索镜像 search
2,下载镜像 pull
3,启动容器 run
# -d后台运行
# --name 起名字
# -p 端口设置
[root@localhost home]# docker run -d --name nginx01 -p 3344:80 nginx
8003c462b02e14eb1ec8e715ab3bb9455fc852ff05081e9363bcafb678f5685a
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8003c462b02e nginx "/docker-entrypoint.…" 27 seconds ago Up 26 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
[root@localhost home]# curl localhost:3344
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8003c462b02e nginx "/docker-entrypoint.…" 7 minutes ago Up 7 minutes 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
# 进入容器
[root@localhost home]# docker exec -it nginx01 /bin/bash
root@8003c462b02e:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@8003c462b02e:/# cd /etc/nginx
root@8003c462b02e:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@8003c462b02e:/etc/nginx#
二,docker安装tomcat
docker run -it --rm tomcat:9.0
#官方的使用方法:用完就删除.
#我们下载再启动运行.
#启动运行
[root@localhost home]# docker run -d -p 3355:8080 --name tomcat01 tomcat
a59f507abec2069bfaf6c99229b9f6d24d1c4ca6b50b01683b9e72f1eef6054d
#进入容器
[root@localhost home]# docker exec -it tomcat01 /bin/bash
三,部署ES+KIBANA
四,Commit镜像(P20)
注意: 新的镜像 = 旧的镜像+在其上的操作!
docker commit -m="提交的描述信息" -a="作者" 容器id 要创建的目标镜像名:[标签名]
五,Docker容器卷(P21)
总结:容器卷是为了容器的持久化和同步操作!容器间也是可以数据共享的!
使用数据卷:
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录 镜像名 /bin/bash
# 查看数据卷是否挂载成功
docker inspect 容器id #在Mounts里看
#通过挂载我们只需要在主机修改,容器同步.
实战:安装Mysql
#获取镜像
root@localhost ~]# docker pull mysql5,7
#运行容器,需要数据挂载 #安装启动Mysql,需要配置密码!
#g官方测试:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动mysql
- d后台启动
-p端口映射
-v 卷挂载
-e 环境配置
--name 容器名字
[root@localhost ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
具名过载与匿名挂载
所有的docker容器的卷在没有指定目录时都是在/var/lib/docker/volumes/卷名/_data下.
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
#匿名挂载,不指定主机路径。
# 命令
docker run -it -v 容器内目录 镜像名 /bin/bash
# 测试nginx
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的数据卷volume的情况,
# VOLUME NAME这里的值是真实存在的目录。
docker volume ls
#具名挂载
# 测试 nginx
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local 4b0d39ec2e42da8a1aab4ed845f5d71181674addfab9f0b9375264b277355a08
local 5576c7a8a55d587ef3b8fc8d18084d6ba4372ddbcc68a71c8ab954d0922e5f79
local juming-nginx
#查看这个卷
[root@localhost ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2022-04-07T19:16:05+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
# ro - rw
#ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
方式二:通过dockerfile来添加:
[root@localhost home]# pwd
/home
[root@localhost home]# cd docker-test-volume
[root@localhost docker-test-volume]# pwd
/home/docker-test-volume
#创建一个dockerfile文件,dockerfile就是构建docker镜像的脚本文件
[root@localhost docker-test-volume]# vim dockerfile1
[root@localhost docker-test-volume]# cat dockerfile1
#文件中的内容:
FROM centos #以centos镜像为基础
VOLUME ["volume01","volume02"] #容器内的目录,匿名挂载
CMD echo "---end---"
CMD /bin/bash
[root@localhost docker-test-volume]# vim dockerfile1
#通过docker build来构建成一个镜像
[root@localhost docker-test-volume]# docker build -f /home/docker-test-volume/dockerfile1 -t yang/centos:1.0 . #build后生成镜像,获得一个新镜像 yang/centos
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in c8e17a444e08
Removing intermediate container c8e17a444e08
---> 980ac9b7cc8c
Step 3/4 : CMD echo "---end---"
---> Running in d547f63dd2e8
Removing intermediate container d547f63dd2e8
---> 56f6d055ea9a
Step 4/4 : CMD /bin/bash
---> Running in ec7251786cf2
Removing intermediate container ec7251786cf2
---> 8d111b2b263e
Successfully built 8d111b2b263e
Successfully tagged yang/centos:1.0
[root@localhost docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yang/centos 1.0 8d111b2b263e About a minute ago 231MB
mysql 5.7 f26e21ddd20d 8 days ago 450MB
nginx latest 12766a6745ee 8 days ago 142MB
centos latest 5d0da3dc9764 6 months ago 231MB
#启动我们的镜像
[root@localhost docker-test-volume]# docker run -it 8d111b2b263e /bin/bash
[root@74f59fff4095 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@74f59fff4095 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 2020 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Apr 7 14:30 dev
drwxr-xr-x. 1 root root 66 Apr 7 14:30 etc
drwxr-xr-x. 2 root root 6 Nov 3 2020 home
lrwxrwxrwx. 1 root root 7 Nov 3 2020 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 2020 lib64 -> usr/lib64
drwx------. 2 root root 6 Sep 15 2021 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 2020 media
drwxr-xr-x. 2 root root 6 Nov 3 2020 mnt
drwxr-xr-x. 2 root root 6 Nov 3 2020 opt
dr-xr-xr-x. 234 root root 0 Apr 7 14:30 proc
dr-xr-x---. 2 root root 162 Sep 15 2021 root
drwxr-xr-x. 11 root root 163 Sep 15 2021 run
lrwxrwxrwx. 1 root root 8 Nov 3 2020 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 2020 srv
dr-xr-xr-x. 13 root root 0 Apr 7 14:07 sys
drwxrwxrwt. 7 root root 171 Sep 15 2021 tmp
drwxr-xr-x. 12 root root 144 Sep 15 2021 usr
drwxr-xr-x. 20 root root 262 Sep 15 2021 var
drwxr-xr-x. 2 root root 6 Apr 7 14:30 volume01 #这个目录就是我们生成镜像时自动挂载的数据卷目录
drwxr-xr-x. 2 root root 6 Apr 7 14:30 volume02
#通过docker inspect可以查看挂载位置
"Mounts": [
{
"Type": "volume",
"Name": "b0c90c8a5291fab5fa993a7a66ff4099e6642f2877fd432e1645e745920f9501",
"Source": "/var/lib/docker/volumes/b0c90c8a5291fab5fa993a7a66ff4099e6642f2877fd432e1645e745920f9501/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "c23a0fd6f412f6f72bb44d54e4be353b586da45c0dbfdcc58c1f28c6c335e502",
"Source": "/var/lib/docker/volumes/c23a0fd6f412f6f72bb44d54e4be353b586da45c0dbfdcc58c1f28c6c335e502/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
六,数据卷容器(P25)
容器之间同步数据。
# 启动容器02,使用容器01的volumes --volumes-from
[root@localhost /]# docker run -it --name docker02 --volumes-from docker01 yang/centos:1.0
注意:删除docker01后,docker02依然有volume01与volume02;
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。
存储在本机的文件则会一直保留!
七,Dockerfile
Dockerfile 是用来构建 Docker 镜像的文本文件,也可以说是命令参数脚本。
docker build 命令用于 从 Dockerfile 构建镜像。可以在docker build命令中使用 -f 标志指向文件系统中任何位置的 Dockerfile 。
Docker镜像发布的步骤:
1、编写一个Dockerfile文件(需要准备tomcat,jdk之类的);
2、docker build 构建成为一个镜像(docker images 就可以看到了)
3、docker run 镜像(可能需要容器映射)---此时就可以本机访问了
4、docker push 镜像(发布镜像到DockerHub、阿里云镜像仓库)
FROM # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER # 镜像维护者的姓名混合邮箱地址
RUN # 镜像构建时需要运行的命令
EXPOSE # 暴露端口
WORKDIR # 镜像的工作目录
ADD # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
VOLUME # 容器数据卷挂载的目录
CMD # 指定容器启动时需要运行的命令,只有最后一个生效
ENTRYPOINT # 指定一个容器启动时要运行的命令,追加命令
COPY # 类似ADD,拷贝文件和目录到镜像中
ENV # 用来在构建镜像过程中设置环境变量,比如mysql的用户名
八,容器互联-link(P35)
直接使用容器名来pin的话,pin不通,link是来解决这个问题的.不推荐!
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it tomcat02 ping tomcat01
#通过link来连接tomcat03与tomcat02
# 再启动一个tomcat03,但是启动的时候连接tomcat02
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat:8.0
0863e59383ffb96f5af503d9cbe6875d08e4084daba26357ffbf0bd3f90bb6a8
# 使用tomcat03 ping通 tomcat02
[root@iZ2zef4kmo4v6a3s72p6qfZ ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.121 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.108 ms
#原理 就是在hosts里加上了这条映射
[root@localhost ~]# docker exec -it tomcat03 cat /etc/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.3 tomcat02 e65c1971be2f
172.17.0.4 5395edbaf747
九,自定义网络(P36)
步骤:
建立自定义网络;
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
de3870e8510390a0de6ad2b58bd7040859c93c686814ce46e65a2c09d13e308d
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
59828937fac6 bridge bridge local
c8b7f8aa9d13 host host local
de3870e85103 mynet bridge local
95626a96170c none null local
运行容器时使用自定义的网络;
oot@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:8.0
a931ea321adf08694159057c9a255975d38de8fa5914d78f67accc4fa72ab9e4
好处:
可以直接通过容器名来ping通。
十,SpringBoot微服务打包Docker镜像
步骤:
1,构建springboot项目
2,打包应用(打成jar包,并构建dockerfile)
Maven->LifeCycle->package 会在target下生成个jar包;
3,编写dockerfile
4,构建镜像
[root@localhost idea]# docker build -t yangidea .
5,发布运行!
[root@localhost idea]# docker run -d -P --name yang-springboot yangidea
2bfc4c450714826374b4571f171caf073d1c4bbde52cb9601ad12a27c522f319
[root@localhost idea]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2bfc4c450714 yangidea "java -jar /app.jar …" 33 seconds ago Up 32 seconds 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp yang-springboot
浏览器输入http://localhost:49153/hello
十一,关于虚拟机启动,本地浏览器访问问题
root@localhost idea]# ifconfig
br-de3870e85103: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.0.1 netmask 255.255.0.0 broadcast 192.168.255.255
ether 02:42:cd:59:92:91 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:2eff:fe7a:d278 prefixlen 64 scopeid 0x20<link>
ether 02:42:2e:7a:d2:78 txqueuelen 0 (Ethernet)
RX packets 55 bytes 82979 (81.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 76 bytes 9988 (9.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.190.128 netmask 255.255.255.0 broadcast 192.168.190.255
inet6 fe80::7e7a:6cef:6f8d:3d4f prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:0e:9d:a8 txqueuelen 1000 (Ethernet)
RX packets 12110 bytes 12222848 (11.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5071 bytes 954708 (932.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
#ens33的inet,用这个就行。
自己尝试:
1.注意改localhost为虚拟机ip地址