Dcoker的常用命令

Docker概述

Docker Engine是一种开源容器化技术,用于构建和容器化您的应用程序。Docker Engine通过以下方式充当客户端-服务器应用程序:

  • 具有长时间运行的守护进程的服务器dockerd
  • API,用于指定程序可以用来与Docker守护程序进行对话和指示的接口。
  • 命令行界面(CLI)客户端docker

CLI使用Docker API通过脚本或直接CLI命令控制或与Docker守护程序进行交互。许多其他Docker应用程序都使用基础API和CLI。守护程序创建和管理Docker对象,例如映像,容器,网络和卷

docker安装

镜像命令

获取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
格式说明:
OPTIONS:选项。可以使用如下OPTIONS:
-a, –all-tags:从镜像仓库中下载所有被标记的镜像
–disable-content-trust:跳过验证
NAME:仓库名
TAG:标签
DIGEST:数据摘要
列出镜像
#[root@iZ8vb6wledc1x148ynsj65Z ~]#docker images 
[root@iZ8vb6wledc1x148ynsj65Z ~]#docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
nginx                latest              ae2feff98a0c        38 hours ago        133MB
tomcat               9.0                 6d15a1d68603        4 days ago          649MB
tomcat               latest              6d15a1d68603        4 days ago          649MB
centos               latest              300e315adb2f        9 days ago          209MB
nginx                alpine              ecd67fe340f9        5 months ago        21.6MB
mariadb              latest              7c1c380b0dd8        5 months ago        407MB
wordpress            5.0.3-php7.2-fpm    fff5cf2c82fe        22 months ago       409MB
zuolan/hexo-alpine   latest              e7407f359128        2 years ago         100MB
zuolan/hexo          latest              2a52ba0a0b35        3 years ago         158MB
infoslack/dvwa       latest              779975a3607d        4 years ago         465MB

结构说明:

REPOSITORY:仓库名称
TAG:标签名称
IMAGE ID:镜像ID
CREATED:创建时间
SIZE:所占用的空间

值得注意的是,一个镜像可以对象多个标签,判断是否为同一个镜像,我们可以查看它的镜像ID,镜像ID是镜像的唯一标识,如果镜像ID一样,则表示为同一镜像!!!

我们可以通过如下命令来查看镜像、容器、数据卷所占用的空间:

[root@iZ8vb6wledc1x148ynsj65Z ~]# docker system df
TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              9                   8                   2.552GB             648.7MB (25%)
Containers          72                  2                   497.5MB             497.4MB (99%)
Local Volumes       112                 106                 1.382GB             242.7MB (17%)
Build Cache                                                 0B                  0B

docker image ls命令更多操作如下:

  • 显示摘要信息docker image ls默认是不输出摘要信息的,我们可以使用--digests来显示摘要信息:
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker image ls --digests
删除镜像

我们可以使用如下命令删除镜像

docker image rm [OPTIONS] IMAGE [IMAGE...]
docker rmi

 

容器命令


说明:我们有了镜像才可以创建容器, linux,下载一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image
#参数说明
--name="Name" 容器的名字 tomcat01、02
-d			  后台方式运行
-it           使用交互方式运行,进入容器查看
-p            指定容器的端口 -p 8000:8000
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口
	-p 容器端口
-P 			  随机指定端口
# 测试,启动并进入容器
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -it centos /bin/bash
[root@5da947128a37 /]# 
[root@5da947128a37 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# 退出容器
[root@5da947128a37 /]# exit
exit
[root@iZ8vb6wledc1x148ynsj65Z ~]# 

列出所有运行中的容器

# docker ps 命令
     #列出当前正在运行的容器
-a   #列出当前正在运行的容器,带出历史运行过的容器
-n=? #显示最近创建的容器
-q   #只显示容器id
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES
f0b375a78154        infoslack/dvwa      "/run.sh"           4 days ago          Up 4 days           0.0.0.0:3306->3306/tcp, 0.0.0.0:8008->80/tcp   adoring_varahamihira


退出容器

exit #直接停止容器并退出
Ctrl + P + Q #容器不停止退出

删除容器

docker rm 容器id 				 	   #删除指定的容器,不能删除正在运行的容器
docker rm -f $(docker ps -aq) 		#删除所有容器
docker ps -a -q | xarges docker rm  #删除所有容器

启动和停止容器的操作

docker start 容器id #启动容器
docker stop 容器id  #停止当前正在运行的容器
docker restart 容器id #重启容器
docker kill 容器id #强制停止当前容器

常用的其他命令


后台启动启动容器

# 命令 docker run -d 镜像名
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d centos 
f15c2b8e1c2a39f7f13f08fbe96156c850f261f18286affb64a8071e44633f5e

#问题:docker ps 发现容器停止了

#常见的坑:docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止

查看日志

docker logs -f -t --tail #容器没有日志
# 编写一段shell脚本
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d centos /bin/bash -c “while true;do echo jhun666;sleep 1;done"
#查看日志 
	--tf #显示日志
	--tail num #要显示的日志的数目
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker logs -tf --tail 10 f0b375a78154 

查看容器中的进程信息ps

# 命令 docker top 容器id
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker top f0b375a78154
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                74236               74222               0                   Dec10               ?                   00:00:00            /bin/bash /run.sh
root                74299               74236               0                   Dec10               ?                   00:00:54            /bin/bash /create_mysql_admin_user.sh
root                329949              74299               0                   16:34               ?                   00:00:00            sleep 5

查看镜像的元数据

#命令
docker inspect 容器id
#测试
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker inspect 715a0540b07e 
[
    {
        "Id": "715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e",
        "Created": "2020-12-15T08:06:03.396031121Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 328791,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-12-15T08:06:03.820286335Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e/hostname",
        "HostsPath": "/var/lib/docker/containers/715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e/hosts",
        "LogPath": "/var/lib/docker/containers/715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e/715a0540b07e9b3f03794b387bd81f0852fad99512b8d291c024e089fcc2735e-json.log",
        "Name": "/nostalgic_hugle",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "shareable",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/87a29200daab8385671b063fe97f31ff2c729b3ae0e58d77dd5684bc2b226342-init/diff:/var/lib/docker/overlay2/db58dad34c95249463d5668d85854cb5658581faf9cdb74ac7e2bdad7743103f/diff",
                "MergedDir": "/var/lib/docker/overlay2/87a29200daab8385671b063fe97f31ff2c729b3ae0e58d77dd5684bc2b226342/merged",
                "UpperDir": "/var/lib/docker/overlay2/87a29200daab8385671b063fe97f31ff2c729b3ae0e58d77dd5684bc2b226342/diff",
                "WorkDir": "/var/lib/docker/overlay2/87a29200daab8385671b063fe97f31ff2c729b3ae0e58d77dd5684bc2b226342/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "715a0540b07e",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "413dad72839751bb9896d9a57b3aadecc98177b5d020b96aebb94b5c4150c9f9",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/413dad728397",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "97ff095996f1be2c49609c65026324d43adb9217b686f127a8fd36f5826c5c69",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "f8d21c90effe4f3bef4b24ffb8cb3e08070b0e2732f88cbc4eef01430b0e36b8",
                    "EndpointID": "97ff095996f1be2c49609c65026324d43adb9217b686f127a8fd36f5826c5c69",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改配置

#命令
docker exec -it 

#测试
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it f0b375a78154 /bin/bash
root@f0b375a78154:/# ls
app                         etc    mnt   run.sh            sys
bin                         home   opt   sbin              tmp
boot                        lib    proc  srv               usr
create_mysql_admin_user.sh  lib64  root  start-apache2.sh  v1.9.tar.gz
dev                         media  run   start-mysqld.sh   var

#方式二
docker attach 容器id
#测试
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker attach f0b375a78154
正在执行当前的代码....

#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach # 进入容器正在执行的终端,不会启动新的进程

从容器内部拷贝文件到主机上

docker cp 容器id:容器内路径 目的主机路径

#测试
#进入容器内部
[root@iZ8vb6wledc1x148ynsj65Z home]# docker attach cc6f95bca49d 
[root@cc6f95bca49d /]# cd /home/
[root@cc6f95bca49d home]# ls
#在容器内建一个文件
[root@cc6f95bca49d home]# touch test.go
#退出容器
[root@cc6f95bca49d home]# exit 
#寻找centos容器的id
[root@iZ8vb6wledc1x148ynsj65Z home]# docker ps -a | grep "centos"
cc6f95bca49d        centos                       "/bin/bash"              4 minutes ago       Exited (0) About a minute ago                                                   nervous_joliot
715a0540b07e        centos                       "/bin/bash"              About an hour ago   Exited (0) 4 minutes ago                                                        nostalgic_hugle
f15c2b8e1c2a        centos                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                    reverent_keller
d07b845d69c8        centos                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                    competent_kirch
bb07d63a2df5        centos                       "/bin/bash"              About an hour ago   Exited (127) About an hour ago                                                  reverent_haibt
bed07eb5e481        centos                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                    optimistic_bhaskara
5da947128a37        centos                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                    vigorous_hodgkin
99876d4235e5        centos                       "/bin/bash"              About an hour ago   Exited (0) About an hour ago                                                    distracted_curie
49d080994ed6        centos                       "/bin/bash"              2 hours ago         Exited (0) 2 hours ago                                                          fervent_cori
#将文件从容器内拷贝之主机
[root@iZ8vb6wledc1x148ynsj65Z home]# docker cp cc6f95bca49d:/home/test.go /home
#查看文件
[root@iZ8vb6wledc1x148ynsj65Z home]# ls
blog  BlueLotus_XSSReceiver  git  msf  postgres  terraria  test.go  www

Docker学习笔记

测试

部署nginx

#1.搜索镜像 可以去docker hub 也可以用命令行
[root@iZ8vb6wledc1x148ynsj65Z ~]#docker search nginx
#2.拉取镜像
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker pull nginx
#3.运行测试
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
nginx                latest              ae2feff98a0c        17 hours ago        133MB
centos               latest              300e315adb2f        8 days ago          209MB
nginx                alpine              ecd67fe340f9        5 months ago        21.6MB
mariadb              latest              7c1c380b0dd8        5 months ago        407MB
wordpress            5.0.3-php7.2-fpm    fff5cf2c82fe        22 months ago       409MB
zuolan/hexo-alpine   latest              e7407f359128        2 years ago         100MB
zuolan/hexo          latest              2a52ba0a0b35        3 years ago         158MB
infoslack/dvwa       latest              779975a3607d        4 years ago         465MB
# -d 后台运行
# --name 为容器指定名称
# -p 宿主机端口:容器内部端口

[root@iZ8vb6wledc1x148ynsj65Z ~]#  docker run -d --name nginx -p 4000:80 nginx
844f1b3736ce0aeeddf3d981305edc9288ac55a9ee8031c53676ffe3dba5379a
[root@iZ8vb6wledc1x148ynsj65Z ~]#curl localhost:4000

#进入容器
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it nginx /bin/bash

安装tomcat

#官方使用
docker run -it -rm tomcat:9.0

# 我们之前的启动都是后台启动,停止容器后,容器是可以查到的 --rm参数一般用来测试,用完后会自动删除

#下载再启动
docker pull tomcat:9.0
docker run -d -p 10000:8080 -name tomcat01 tomcat

#测试访问无问题 但404
#进入容器
docker exec -it tomcat01 /bin/bash

#发现问题 1.linux命令少了 2.webapps为空 
#原因 阿里云的镜像是默认的最小的镜像,所有的不必要的都会被剔除
#保证最小的可运行的环境

部署es

# es 暴露的端口多
# es 耗内存
# es的数据一般需要放置到安全目录!需要挂载
# --net somenetwork ? 网络配置 
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2 

#启动后 服务器直接卡炸了= = docker stats 可以查看CPU状态
#赶紧关闭 ,增加内存的限制,修改配置文件 -e 环境配置修改
docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "ES_JAVA_OPST=Xms64Mm Xmx512m"elasticsearch:7.6.2 

 

可视化


  • Portainer

    docker run -d -p 8088:9000 \
    --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
    
  • 什么是portainer

    Docker图形化界面管理工具!提供一个后台面板供我们操作

docker镜像详解

UnionFS 联合文件系统

我们下载的时候看到的一层层就是这个! UnionFS (联合文件系统) : Union文件系统( UnionFS)是-种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改 作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Uniqn 文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像) ,可以制作各 种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的 文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上由一层层的文件系统组成,这种层级的文件系统UnionFS. bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是弓|导加载kernel, Linux刚启动时会加载bootfs文件系 统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成 之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs. rootfs (root file system) ,在bootfs之上。包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs就是 各种不同的操作系统发行版,比如Ubuntu , Centos等等。

 

Docker学习笔记

Commit镜像

如何提交自己的镜像?

docker commit 提交容器成为一个新副本
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]
#测试
#1.启动一个默认的tomcat
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d -p 10000:8080 --name tomcat02 tomcat:9.0

#2.进入容器内部 并将webapps.dist 的 文件复制到 webapps中
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it tomcat02 /bin/bash
[root@iZ8vb6wledc1x148ynsj65Z ~]# cp -r ./webapps.dist/* /webapps

#3.退出容器,提交镜像到本地仓库 []为注释
[root@iZ8vb6wledc1x148ynsj65Z ~]# [ctrl]+[p]+p[q]
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker commit -a="junh" -m="add webapps app"[描述信息] e459781b9c6e tomcat02[REPOSITORY ]:0.1[TAG]

####

容器数据卷


什么是容器数据卷

docker的理念回顾 将应用和环境打包成一个镜像! 数据?如果数据都在容器中,那么我们容器删除,数据就会失!需求:数据可以持久化 MySQL ,容器删了,删库跑路 !需求: MySQL数据可以存储在本地! 容器之间可以有一个数据共享的技术! Docker 容器中产性的数据,同步到本地! 这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!

Docker学习笔记

使用数据卷

方式一:使用 -v 参数挂载目录

docker run -it -v 主机目录:容器内目录

#测试
[root@iZ8vb6wledc1x148ynsj65Z home]# docker run -it -v /home/ceshi:/home centos  /bin/bash

#查看容器元状态
[root@iZ8vb6wledc1x148ynsj65Z home]# docker inspect 58887bacc9ef 

Docker学习笔记

挂载的文件是同步的,即使关闭了容器,修改了文件,容器内也会修改

好处:我们以后只需要在本地修改即可,容器会自动同步

具名和匿名挂载

# 匿名挂载
- v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx

#查看所有的卷的情况
docker volume ls
#这就是匿名挂载 ,我们只写了 容器内的路径,没有写容器内的路径

#具名挂载
docker run -d -P --name nginx02 -v jumingnginx:/etc/nginx nginx 
docker volume ls
DRIVER		VOLUME NAME
local		jumingnginx

#通过 -v 卷名:容器内路径
#查看一下这个卷
docker volume inspect jumingnginx

Docker学习笔记

docker 所有容器内的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxx/_data

我们可以通过具名挂载可以方便的找到我们的一个卷,大多数情况推荐使用具名挂载

#如何确定是具名挂载还是匿名挂载
-v 容器内路径	#匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /容器外路径:/宿主内路径 #指定路径挂载

扩展

# 通过-v 容器内路径 ro rw 改变读取权限
	ro read only
	rw read write
# 一但设置了这个容器权限 容器对我们挂载出来的内容就有限定了!  
docker run 	-d -P --name nginx -v jumingnginx:/etc/nginx:ro nginx

# ro 只要看到ro就说明这个路径只能通过宿主机来操作 容器内部是无法操作的

 

初识DockerFile


Dockerfile 就是用来构建docker镜像的构建文件!

通过该脚本可以生成镜像 ,镜像是一层一层的,脚本是一个一个的命令,每个命令都是一层

# 创建一个dockerfile文件,当然名字可随便取 
# 文件内容 指令(大写) 参数
[root@iZ8vb6wledc1x148ynsj65Z docker-test-volume]# vim dockerfile1

FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"
CMD /bin/bash

Docker学习笔记

#启动自己写的容器
[root@iZ8vb6wledc1x148ynsj65Z docker-test-volume]# docker run -it b9ebbb974e7a /bin/bash

Docker学习笔记

这两个卷在外部一定有一个同步的目录(匿名挂载 )

数据卷容器


多个mysql同步数据

Docker学习笔记

#启动三个容器,通过我们刚才自己写的镜像启动

Docker学习笔记

Docker学习笔记

结论:

容器之间配置信息的传递,数据卷容器的生命周期一直持续到没人用为止

Dockerfile

Dockerfile介绍

  1. 构建一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run 运行镜像
  4. docker push 发布镜像(docker hub、阿里云镜像仓库)

Dokcerfile构建过程

基础知识

  1. 每个关键字(指令)都是大写字母
  2. 执行从上到下顺序执行
  3. #表示注释
  4. 每一个指令都会创建提交一个新的镜像层 并提交

Docker学习笔记

DockerFile:构建文件,定义了一切的步骤,源代码

DockerImages:通过dockerfile构建生成的镜像,最终发布

Dokcer容器:容器就是镜像运行起来提供服务

DockerFile的指令

FROM   		#基础镜像 ,一切从这里开始构建
MAINTAINER  #镜像是谁写的,姓名+邮箱
RUN 		#镜像构建时的需要运行的命令
ADD         # 步骤,tomcat镜像,添加一个tomcat压缩包!添加内容
WORKDIR     #镜像的工作目录
VOLUME 		#挂载的目录
EXPOSE      #开放的端口 == -p
CMD			#指定这个容器启动的时候需要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT  #指定这个容器启动的时候需要运行的命令,可以追加命令
ONBUILD     #ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。
COPY 		#类似ADD,将我们的文件拷贝到镜像中
ENV		#构建的时候设置环境变量

Docker学习笔记](https://imgchr.com/i/r0PYvj)

测试

Docker Hub 中大部分镜像都是从基础镜像 scratch 构建起来的,然后配置需要的软件和配置来构建的

创建一个自己的centos

# 1.编写dockerfile的文件
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# cat mydockerfile-centos 
FROM centos

MAINTAINER geju<993500718@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUM yum -y install net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "--- end ---"

CMD /bin/bash
# 2 通过这个文件构建镜像
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .

Successfully built b3d16f342fb6
Successfully tagged mycentos:0.1

# 3.测试运行
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker run -it mycentos:0.1

对比官方原生centos镜像

Docker学习笔记

我们可以通过docker history 镜像id查看该镜像的构建过程

Docker学习笔记

CMD 和 ENTRYPOINT 的区别

COPY 		#类似ADD,将我们的文件拷贝到镜像中
ENV			#构建的时候设置环境变量

测试cmd

[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# vim docker-cmd-test
FROM centos
CMD ["ls","-a"]

#构建镜像
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker build -f docker-cmd-test -t cmdtest .

#run
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker run 2c8549f704a1
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
#试图追加命令 -l 期望返回 ls -al
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker run 1d1d618faca1 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:296: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# 
#cmd情况下 -l 替换了 CMD ["ls","-a"] 不是命令 所以报错

测试ENTRYPOINT

[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# vim dockerfile-entrypoint-test
FROM centos
ENTYRPOINT ["ls","-a"]

#构建镜像
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker build -f dockerfile-entrypoint-test -t entrypoint-test .

#run
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker run 77048852feb9

#追加命令
[root@iZ8vb6wledc1x148ynsj65Z dokcerfile]# docker run 77048852feb9 -l
total 0
drwxr-xr-x   1 root root   6 Dec 20 08:59 .
drwxr-xr-x   1 root root   6 Dec 20 08:59 ..

Docker命令中有许多相似的命令,但有细微的区别,所以学习其最好的学习方法,就是对比其测试效果

实战:tomcat镜像

  1. 准备镜像文件 tomcat压缩包 jdk压缩包

    Docker学习笔记

  2. 编写dockerfile 官方默认名字 Dockerfile,build会自动寻找该文件 不需要再 -f 指定

    FROM centos
    
    MAINTAINER geju<993500718@qq.com>
    
    COPY readme.txt /usr/local/readme.txt
    
    ADD jdk-8u271-linux-aarch64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.41.tar.gz /usr/local
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_271
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME  /usr/local/apache-tomcat-9.0.41
    ENV CATALINA_BASH  /usr/local/apache-tomcat-9.0.41
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:CATALINA_HOME/bin
    
    EXPOSE 8080
    CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /url/local//usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out
    
  3. 构建镜像

    # docker build -t diytomcat .
    
  4. 运行

    [root@iZ8vb6wledc1x148ynsj65Z tomcat]# docker run -d -p 9000:8000 --name gejutomcat -v /home/geju/build/tomcat/test:/usr/local/apache-tomcat-9.0.41/webapps/test -v /home/geju/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.41/logs diytomcat
    
  5. 访问测试

  6. 发布项目 (由于启动了卷挂载,可以直接在本地文件进行编写)

    [root@iZ8vb6wledc1x148ynsj65Z ~]# mkdir WEB-INFO
    [root@iZ8vb6wledc1x148ynsj65Z ~]# cd WEB-INFO/
    [root@iZ8vb6wledc1x148ynsj65Z ~]# vim web.xml
    [root@iZ8vb6wledc1x148ynsj65Z ~]# vim index.jsp 
    

     

    <?xm1 version="1. 0" encoding="UTF-8"?>
    <web-app xm1ns="http://java. sun. com/ xm1/ns/javaee"
    		 xm1ns :xsi="http://www. w3. org/2001/XML Schema-ins tance"
    		 xsi:sChemaL ocation="http:/ /java. sun. com/ xm1/ns/javaee
    		 http://java. sun. com/ xm7 /ns /javaee/web-app_ 2_ 5. xsd"
             version="2.5">
    </web-app>
    
    <%@ page language="java" contentType="text/htm1; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <! DOCTYPE html>
    <html>|
    <head>
    <meta charset="utf-8">
    <title>hello,geju</title>
    </head>
    <body>
    Hel1o World!<br/>
    <%
    System.out.println("----my test web logs ----")
    %>
    </body>
    </html>
    

    发布自己的镜像

    DockerHub

  7. dockerhub注册账号

  8. 在服务器上提交镜像

    [root@iZ8vb6wledc1x148ynsj65Z ~]#  docker login --help
    
    Usage:	docker login [OPTIONS] [SERVER]
    
    Log in to a Docker registry
    
    Options:
      -p, --password string   Password
          --password-stdin    Take the password from stdin
      -u, --username string   Username
    
    
  9. 登录完毕后就可以提交镜像了 docker push

    [root@iZ8vb6wledc1x148ynsj65Z ~]# docker login -u ruofeng60
    Password: 
    Login Succeeded
    [root@iZ8vb6wledc1x148ynsj65Z ~]# docker push geju/diytomcat:1.0
    fcc7fccb8e04: Preparing
    b5577f344233: Preparing
    bdcb94365850: Preparing
    1c5bd81521f5: Preparing
    0683de282177: Preparing
    

     

Docker流程小结

Docker学习笔记

Docker网络


理解Docker0

清空所有环境

测试

Docker学习笔记

三个网络

# 问题:docker 是如何处理容器访问网络	

Docker学习笔记

[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d -P --name tomcat01 tomcat

#查看容器内部网络地址 ip addr
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d -P --name tomcat01 tomcat
31be228613960a63849e70fcee38217635e7bf1bafd475eb37e171877a460778
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it 31be228613960a63849e70fcee ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
119: eth0@if120: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
# 思考 linux能不能ping通容器内部
 [root@iZ8vb6wledc1x148ynsj65Z ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.123 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.056 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.077 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.067 ms

# linux 可以 ping 通 docker 容器内部

原理

  1. 我们每启动一个docker容器,docker就会docker容器分配一个ip,我们只要安装了docker,就会有一个docker0网卡,桥接模式,使用的技术是evth-pair技术

    Docker学习笔记

  2. 再启动一个容器测试

    Docker学习笔记

     # 我们可以发现 网卡都是成对出现的
     # evth-pair 就是一对的虚拟设备接口,都是成对出现,一端连接着协议,一端互相通信
     # 因为此特性 ,evth-pari 充当一个桥梁,连接各虚拟设备
    

    3.我们发现容器和容器直接可以相互 ping 通

    [root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it tomcat01 ping 172.17.0.3
    PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
    
    

    Docker学习笔记

     

    结论: tomcat01 和 tomcat02 都是使用的同一个网卡 docker0

    所有容器不指定网络的情况下,都是使用的默认路由 dokcer0 ,docker会给我们分配一个默认的可用的ip

    小结

Dokcer使用的是linux的桥接

Docker学习笔记

Docker学习笔记

删除容器后,对应网桥就没了

容器互联 --link

 [root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

# 通过 --link 可以直接使服务互联
[root@iZ8vb6wledc1x148ynsj65Z ~]# 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.110 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.093 ms
^C
--- tomcat02 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 55ms
rtt min/avg/max/mdev = 0.085/0.096/0.110/0.010 ms
# 反向无法ping通
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known

通过 docker network inspect 探究

Docker学习笔记

# 查看 host 配置
[root@iZ8vb6wledc1x148ynsj65Z ~]# 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 572f63fcda70
172.17.0.2	f3e4e04b4d82

-- link就是在 hosts 配置中增加了一个 172.17.0.3 tomcat02 572f63fcda70

但是现在已经不在推荐 --link

一般都是自定义网络 不适应docker0 docker0不支持容器名访问

自定义网络

查看所有的docker容器

Docker学习笔记

网络模式

bridge: 桥接模式(默认)

none :不配置网络

host:和宿主机共享网络

container : 容器网络连通(用的少,局限大)

测试

# 该命令 --net bridge 就是docker0
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker run -d -P --name  tomcat01 --net bridge tomcat

# docker0 特点:默认,域名不能访问, --link可以打通连接

# 我们可以自定义一个网络
# --driver bridge 
# --subnet 192.168.0.0/16 子网地址
# --subnet 192.168.0.0/16 网关
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker network create --driver bridge --subnet 192.168.0.0/16 ---subnet 192.168.0.0/16
67557bd5ea1c24f15f7f8db174f4e11fab261f1e7d26d74463d51120ef9381af
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f8d21c90effe        bridge              bridge              local
91a2ef0e69b5        hexo_default        bridge              local
4db182d2ea5b        host                host                local
67557bd5ea1c        mynet               bridge              local
67112e631bbc        none                null                local
d5363aa782c6        wpress_backend      bridge              local
66a13c8cb726        wpress_frontend     bridge              local

我们自己的网络就创建好了

Docker学习笔记

Docker学习笔记

# 再次测试 不使用 --link 也可以通过名字 ping 通
[root@iZ8vb6wledc1x148ynsj65Z ~]#  docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.100 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.112 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.088 ms
^C
--- tomcat-net-02 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 73ms
rtt min/avg/max/mdev = 0.088/0.112/0.151/0.027 ms

我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络

 

好处:

不同的集群使用不同的网络,可以保证集群是安全和健康的

网络联通

Docker学习笔记

Docker学习笔记

# 测试 联通tomcat01 和 mynet 
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker network  connect mynet tomcat01

#发现联通后 直接把tomcat01 加入到了 mynet 中

# 一个容器 两个ip

#发现可以 两个容器可以 ping
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.085 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.088 ms
^C
--- tomcat-net-01 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 55ms
rtt min/avg/max/mdev = 0.085/0.098/0.122/0.018 ms

Docker学习笔记

实战:部署redis集群

Docker学习笔记

# 创建网卡
[root@iZ8vb6wledc1x148ynsj65Z ~]# docker network create redis --subnet 172.38.0.0/160e4e783d5764ebbc03a38366723e15cd6f3524f93de74df8c4ff8048aca99761

# 通过脚本创建6个redis 
#通过脚本一次创建6个redis配置
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
# 通过脚本一次启动6个redis容器
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /mydata/redis/node-${port}/data:/data \
-v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done

#data/ redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:637
9 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: adf737a2c7e8cb4ba4670514ad7952bf15dee180 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
M: 144454a4a2ee1f1b0447b43e0ad1e9e344330d2a 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 9db61b65dc3a78f5bc57724a50f2b0bcab01c2d6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
S: 0dd556eb30095e1cac02c2c3b8e2fa7531dfa7bc 172.38.0.14:6379
   replicates 9db61b65dc3a78f5bc57724a50f2b0bcab01c2d6
S: e46328f77f2e2545aee9c3ddfeaaf88b16287849 172.38.0.15:6379
   replicates adf737a2c7e8cb4ba4670514ad7952bf15dee180
S: 6c049000630f44e6d5ce9b0c3a1bacddd0bc1b30 172.38.0.16:6379
   replicates 144454a4a2ee1f1b0447b43e0ad1e9e344330d2a
Can I set the above configuration? (type 'yes' to accept): yes   
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
......
>>> Performing Cluster Check (using node 172.38.0.11:6379)
M: adf737a2c7e8cb4ba4670514ad7952bf15dee180 172.38.0.11:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: e46328f77f2e2545aee9c3ddfeaaf88b16287849 172.38.0.15:6379
   slots: (0 slots) slave
   replicates adf737a2c7e8cb4ba4670514ad7952bf15dee180
M: 144454a4a2ee1f1b0447b43e0ad1e9e344330d2a 172.38.0.12:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 6c049000630f44e6d5ce9b0c3a1bacddd0bc1b30 172.38.0.16:6379
   slots: (0 slots) slave
   replicates 144454a4a2ee1f1b0447b43e0ad1e9e344330d2a
S: 0dd556eb30095e1cac02c2c3b8e2fa7531dfa7bc 172.38.0.14:6379
   slots: (0 slots) slave
   replicates 9db61b65dc3a78f5bc57724a50f2b0bcab01c2d6
M: 9db61b65dc3a78f5bc57724a50f2b0bcab01c2d6 172.38.0.13:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


Docker Compose

官方介绍

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.
  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.
  3. Run docker-compose up and Compose starts and runs your entire app.

作用:批量容器编排

我自己的理解

Compose 是 Dokcer 官方的开源项目。需要安装

Dockerfile让程序在任何地方都可以运行,但是如果需要编排多个服务,就会很麻烦

于是有了docker compose 通过yaml文件可以批量编排容器

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

docker-compose 重要的概念:

  • 服务 service,容器,应用
  • 项目 project :一组关联的容器

安装

  1. 下载

    sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    当然下载会很慢

    我推荐用pip安装

    安装python-pip

    yum -y install epel-release
     
    yum -y install python-pip
    

    安装docker-compose

    pip install docker-compose
    
  2. 授权

    chmod +x /usr/local/bin/docker-compose
    

Dokcer-compose编写规则

# 实际上只有3层

version: '' # 版本
services"   #服务
  		服务1:web
  		#服务配置
  		images
  		build
  		......
  		服务2:redis
  		......
  		服务3: redis
#其他配置 网络/卷 全局规则
volumes:
network:
configs: 

Docker学习笔记

实战:Docker-compose搭建个人博客

切换到home目录,并创建my_wordpress文件夹

[root@iZ8vb6wledc1x148ynsj65Z home]# cd /home/
[root@iZ8vb6wledc1x148ynsj65Z home]# mkdir my_wordpress/	

编写docker-compose.yaml

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

k8s以后再开文记录学习