Docker学习

一,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地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值