Docker笔记

安装docker

#1.卸载旧的版本、
 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
                  
#2.需要的安装包
yum install -y yum-utils
#3.设置镜像的仓库 使用阿里云仓库
yum -config-manager \
   --add-repo \ 
   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum 软件包索引
yum makecache fast
# 安装docker 相关的 
yum install docker-ce docker-ce-cli containerd.io
# 启动docker
systemctl start docker
#查看版本
docker -v 
# hello world
docker run hello-world
#查看下载的hello world 镜像
docker images
#卸载docker
yum remove docker-ce docker-ce-cli containerd.io
#删除资源 
 sudo rm -rf /var/lib/docker
 
#配置镜像加速器
​
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://tuas0rv4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

底层原理

Docker是怎么工作的?

Docker 是一个Client -Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问!

DockerServer 接收到Docker-Client 的指令,就会执行这个命令!

Dokcer 为啥比VM K快呢?

1、docker 有比虚拟机更少的抽象层

2、docker利用的是宿主机的内核,vm需要的是Guest OS。

所以 说 新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统内核,避免引导。

虚拟机是加载Guest OS,分钟级别的,docker 是利用宿主机的操作系统,省略了这个复杂过程,秒级!

Docker的常用命令

帮助命令

docker version # 版本信息
docker info # 显示docker的系统信息,包括镜像和容器数量
docker --help # 帮助文档
​

帮助文档地址:https://docs.docker.com/engine/reference/commandline/app_upgrade/

镜像命令

[root@node1 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   3 months ago   13.3kB
​
#可选项
 -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs
​
​

docker search搜索镜像

#docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11057     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4192      [OK]       
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   821                  [OK]
percona                           Percona Server is a fork of the MySQL relati…   544       [OK]       
phpmyadmin                        phpMyAdmin - A web interface for MySQL and M…   257       [OK]       
centos/mysql-57-centos7           MySQL 5.7 SQL database server                   88                   
​
#可选项 通过收藏来过滤
 -f, --filter filter   Filter output based on conditions provided
 
[root@node1 ~]# docker search mysql --filter=STARS=3000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   11057     [OK]       
mariadb   MariaDB Server is a high performing open sou…   4192      [OK]       
[root@node1 ~]# docker search mysql --filter=STARS=5000
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   11057     [OK]  
​
​

docker pull 拉取镜像

#docker pull 镜像名[:tag] 
[root@node1 ~]# docker pull mysql
Using default tag: latest #如果不写tag 默认就是latest
latest: Pulling from library/mysql
b4d181a07f80: Pull complete # 分层下载docker image 的核心 联合文件系统
a462b60610f5: Pull complete 
578fafb77ab8: Pull complete 
524046006037: Pull complete 
d0cbe54c8855: Pull complete 
aa18e05cc46d: Pull complete 
32ca814c833f: Pull complete 
9ecc8abdb7f5: Pull complete 
ad042b682e0f: Pull complete 
71d327c6bb78: Pull complete 
165d1d10a3fa: Pull complete 
2f40c47d0626: Pull complete 
Digest: sha256:52b8406e4c32b8cf0557f1b74517e14c5393aff5cf0384eff62d9e81f4985d4b # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址
​
#指定版本下载
docker pull mysql:5.7
[root@node1 ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
b4d181a07f80: Already exists  # 已经存在的
a462b60610f5: Already exists 
578fafb77ab8: Already exists 
524046006037: Already exists 
d0cbe54c8855: Already exists 
aa18e05cc46d: Already exists 
32ca814c833f: Already exists 
52645b4af634: Pull complete 
bca6a5b14385: Pull complete 
309f36297c75: Pull complete 
7d75cacde0f8: Pull complete 
Digest: sha256:1a2f9cd257e75cc80e9118b303d1648366bc2049101449bf2c8d82b022ea86b7
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
​

docker rmi 删除镜像

docker rmi -f 09361feeb475 #容器ID 删除
docker rmi -f 容器ID 容器ID 容器ID 容器ID #删除多个容器
docker rmi -f $(docker images -aq) #删除全部容器

容器命令

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

docker pull centos

新建容器并启动

docker run [可选参数] image
#参数说明
--name="name" #容器名字 tomcat01 用来区分容器
-d            #后台运行
-it           #使用交互方式运行,进入容器查看内容
-P            #指定容器的端口 -p 8080:8080
     -P ip:主机端口:容器端口
     -P 主机端口:容器端口   #常用的
     -P 容器端口
     容器端口
-p            #随机指定端口
​
#启动并进入容器
[root@node1 ~]#  docker run -it centos /bin/bash
[root@4d3e450d5ec8 /]# 
#退出容器 exit
​

列出所有运行的容器

#docker ps 命令
   #列出所有运行的容器
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
-a #列出所有运行的容器+历史运行过的容器
[root@node1 ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                    PORTS     NAMES
4d3e450d5ec8   centos         "/bin/bash"   4 minutes ago   Exited (0) 2 minutes ago         nifty_northcutt
77a0ab3fa646   d1165f221234   "/hello"      3 hours ago     Exited (0) 3 hours ago          gallant_goldberg
-n=? #显示最近创建的容器
[root@node1 ~]# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                     PORTS     NAMES
4d3e450d5ec8   centos    "/bin/bash"   7 minutes ago   Exited (0) 5 minutes ago             nifty_northcutt
-q #[root@node1 ~]# docker ps -aq
4d3e450d5ec8
77a0ab3fa646

退出容器

exit #直接容器停止并退出
ctrl +q+p # 容器不停止退出

删除容器

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

启动和停止容器的操作

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

常用其他命令

后台启动容器

#命令 docker run -d centos
#问题 docker ps 发现centos停止了
#常见的坑, docker容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止。
#nginx ,容器启动后发现自己没有提供服务,就会立刻停止,就是没有程序了。

查看日志

docker logs -f -t --tail num  容器id # 显示条数
#自己编写一段脚本 
[root@node1 ~]# docker run -d centos /bin/sh -c "while true;do echo semon;sleep 1;done"
[root@node1 ~]# docker logs -f -t --tail 10 0f8d74ee2211
2021-06-28T08:09:02.318299293Z semon
2021-06-28T08:09:03.323007412Z semon
2021-06-28T08:09:04.329110071Z semon
2021-06-28T08:09:05.330689261Z semon
docker logs -f -t #显示全部日志

查看容器中进程信息

docker top 容器id
[root@node1 ~]# docker top 0f8d74ee2211
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                14737               14718               0                   16:04               ?                   00:00:00            /bin/sh -c while true;do echo semon;sleep 1;done
root                23034               14737               0                   16:11               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
​

查看镜像元数据

docker inspect 容器id
[root@node1 ~]# docker inspect 0f8d74ee2211
[
    {
        "Id": "0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c",
        "Created": "2021-06-28T08:04:27.53170449Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true;do echo semon;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 14737,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-06-28T08:04:27.832891841Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/hostname",
        "HostsPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/hosts",
        "LogPath": "/var/lib/docker/containers/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c/0f8d74ee22114255b34828ae5973af8f76886093ae4e8929c5687f95f76ca46c-json.log",
        "Name": "/amazing_pare",
        "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,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "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,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339-init/diff:/var/lib/docker/overlay2/dab160a5c0a378de625a23b62d11a24d7438f050969cc3894a82e672f4cc999a/diff",
                "MergedDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/merged",
                "UpperDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/diff",
                "WorkDir": "/var/lib/docker/overlay2/082292596c516caca00e0ffe925038591af565857d52e14f975bf4be4b5ce339/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "0f8d74ee2211",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "while true;do echo semon;sleep 1;done"
            ],
            "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": "9fbd4aa5c4b6e2854cdc698d320be51f1c2cba41d690d6b89391276d7462f630",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/9fbd4aa5c4b6",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "d57d2b31d79cab82c865a29f787b887453b40916c9fd6b5f31e070e33a70e57b",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "e45daf867404c245d05a5db14da208fd13b52801027a58a717b64ad46c4580b3",
                    "EndpointID": "d57d2b31d79cab82c865a29f787b887453b40916c9fd6b5f31e070e33a70e57b",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
​

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置
​
#命令
docker exec -it 容器id
[root@node1 ~]# docker exec -it 0f8d74ee2211 /bin/bash
[root@0f8d74ee2211 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@0f8d74ee2211 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:04 ?        00:00:00 /bin/sh -c while true;do echo semon;sleep 1;done
root       846     0  0 08:18 pts/0    00:00:00 /bin/bash
root       877     1  0 08:18 ?        00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1
root       878   846  0 08:18 pts/0    00:00:00 ps -ef
[root@0f8d74ee2211 /]# 
#方式二
docker attach 容器id
[root@node1 ~]# docker attach 0f8d74ee2211
semon
semon
semon
#docker exec 进入容器后开启一个新的终端可以在里面操作 常用
#docker attach 进入容器正在执行的终端,不会启动新的

从容器中拷贝文件到主机

docker cp 容器id:容器内路径 目的主机路径
[root@node1 home]# docker cp cb1c7c3aa103:/home/semon.java /home
[root@node1 home]# ls
admin  semon.java
#拷贝是一个手动过程,未来我们使用 -v 卷的技术,可以实现 自动同步

常用命令总结

attach #当前 shell下 attch连接指定运行镜像
build #通过Dockerfile定制镜像
commit # 提交当前容器为新的镜像
cp # 从容器中拷贝指定文件或者目录到 主机中
create # 创建一个新的容器 同 run 但不启动容器
diff # 查看docker 容器的变化
enents # 从docker 服务获取实时事件
exec # 在已存在的容器上运行命令
export # 导出容器的内容流 最为一个 tar归档文件 对应 import
history # 展示一个镜像形成历史
images # 列出系统当前镜像
import # 从tar包的内容中创建一个新的文件系统映像
info #显示系统相关信息
inspect # 查看容器详细信息
kill # 杀死指定容器
load # 从一个tar包中加载一个镜像
login # 注册或者登陆一个docker源服务器
logout #从当前docker registry 退出
logs # 输出当前容器日志xinxx
port # 查看映射端口对应的容器内部源端口
pause # 暂停容器
ps # 列出容器列表
pull # 从docker 镜像源服务器拉取指定镜像
push # 推送指定镜像至docker源服务器
restart # 重启运行的容器
rm # 移除一个或多个容器
rmi # 移除一个或多个镜像
run # 创建一个新的容器并运行一个命令
save # 保存一个镜像为一个tar包
search # 在docker hub 中搜索镜像
start # 启动容器
stop # 停止容器
tag #给源中镜像打标签
top # 查看容器中运行的进程信息
unpause # 取消暂停容器
version # 查看docker 版本号
wait # 截取容器停止时的退出状态值

docker 安装 nginx

docker search nginx 
docker pull nginx 
docker images 
docker run -d --name nginx01 -p 3344:80 nginx
curl localhost:3344
docker exec -it nginx01 /bin/bash

docker 安装tomcat

#官方的使用
docker run -it --rm tomcat:9.0
#我们之前启动都是后台,停止容器之后,容器还可以查到,docker run -it --rm 一般用于测试 用完即删除
docker run -d -p 3355:8080 --name tomcat01 tomcat
#发现问题
root@bc46a9be65b0:/usr/local/tomcat# cd webapps
root@bc46a9be65b0:/usr/local/tomcat/webapps# ls
root@bc46a9be65b0:/usr/local/tomcat/webapps# 
#linux 命令少了 没有webapps 阿里云镜像的原因 把不必要的都剔除了。
#保证最小可运行环境
root@bc46a9be65b0:/usr/local/tomcat# cp -r webapps.dist/* webapps
​

部署ES +kibaba

# es 暴露的端口很多!
# es 十分的耗内存
# es 的数据一般需要放置到安全目录! 挂载
# --net somenetwork ? 网络配置
# 启动 elasticsearch
$ docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch
# 启动后 异常卡 docker status 查看cpu 状态
#赶紧关闭,增加内存的限制
$ docker run -d --name elasticsearch01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS=“Xms64m -Xmx512m" elasticsearch

可视化

portainer (先用这个)

#docker 图形化界面管理工具! 提供一个后台面板供我们操作
docker run -d -p 3388:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

commit 镜像

docker commit 提交容器成为一个新的副本
#命令和git原理类似
docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

实战测试

# 启动一个默认的tomcat
#发现默认的tomcat webapps 下无文件
docker commit -a="semon" -m="add webapps app" 9c85c540f36d tomcat02:1.0

容器数据卷

什么是容器数据卷

docker的理念回顾

将应用和环境打包成一个镜像!

数据? 如果数据都再容器中,那么我们容器删除,数据就会丢失! 需求:数据可以持久化!

Mysql ,容器删了,删库跑路! 需求 Mysql 数据可以存储再本地!

容器之间可以有一个数据共享技术! docker容器中产生的数据,同步到本地!

这就是卷技术! 目录的挂载,将我们容器内的目录,挂在再linux上。

总结一句话: 容器的持久化和同步操作! 容器间也是可以数据共享的!

使用数据卷

方式1: 直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录
docker run -it -v /home/ceshi:/home centos /bin/bash
docker inspect 1587618bf29a
 "Mounts": [
       {
           "Type": "bind",
           "Source": "/home/ceshi",
           "Destination": "/home",
           "Mode": "",
           "RW": true,
           "Propagation": "rprivate"
       }
   ],
#停止容器 后 宿主机上修改文件 再启动容器,也会同步数据到容器中。
#好处 :我们以后修改配置信息只需要在本地修改即可,容器内会自动同步!

实战:安装Mysql

思考:mysql 的数据持久化问题!

#获取镜像 
docker pull mysql:5.7
#运行容器 需要做数据挂载! 安装mysql 是需要配置密码的!
#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
#启动成功 可以连接到数据库

具名和匿名挂载

# 匿名挂载
-v 容器内路径
docker run -d -p --name nginx01 -v /etc/nginx nginx
#查看所有卷的情况
docker volume ls
[root@node1 ~]# docker volume ls
DRIVER    VOLUME NAME
local     1d5efcd3e3fd8c94c92399d18e91a64c007271beaeb1c4779f4c3c47d99dfb96
local     2de35d8b85dc237289f2b5cd645e8574039af80f34cceb07cc506976df991fac
local     3f84e0c71618ca9918dfd3f1c4be6220a595e58b5027ba77add5faa0944ea208
local     5d07b6631b4c43a12349cec27595b7b57fb421d881f4fbeb01d306b94f605129
local     70df0e79eada9a661efb0dfe4403806110df6f685bb10c4adb725a88a0741907
local     662bf01892bf89749135f06f92b0cffb0dbe89ece9116baaf5eceeb429a795c3
#这里发现都是匿名
#具名挂载
[root@node1 ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
6ea465bcc542d194843616189259929cfebd3899dcec6d5325aaf63b3c3b09af
[root@node1 ~]# docker volume ls
DRIVER    VOLUME NAME
local     1d5efcd3e3fd8c94c92399d18e91a64c007271beaeb1c4779f4c3c47d99dfb96
local     2de35d8b85dc237289f2b5cd645e8574039af80f34cceb07cc506976df991fac
local     3f84e0c71618ca9918dfd3f1c4be6220a595e58b5027ba77add5faa0944ea208
local     5d07b6631b4c43a12349cec27595b7b57fb421d881f4fbeb01d306b94f605129
local     70df0e79eada9a661efb0dfe4403806110df6f685bb10c4adb725a88a0741907
local     662bf01892bf89749135f06f92b0cffb0dbe89ece9116baaf5eceeb429a795c3
local     cc3f870cc847a991494f2276821bd4d9a0ec431f7ac5ae77a59c3be04c04b78f
local     e0a8116978af231c376b6dbfe02036b58e89efe6b6e50fec46c52d9393f242ec
local     fb4de6e70d5496641d9e133055725e45681847f8cc7317506e2b5e004df69b59
local     juming-nginx
# 通过-v 卷名:容器内路径
#查看一下 这个卷

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

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

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

拓展:

#通过 -v 容器内路径: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
# ro 只要看到ro 就说明这个路径只能通过宿主机来操作,容器内部是无法操作的!

Dockerfile

Dockerfile 就是用来构建docker 镜像的构建文件! 命令脚本,先体验一下。

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

#创建一个dockerfile文件 ,名字建议 dockerfile
# 文件中的内容 指令 都是大写的 参数
[root@node1 docker-test-volume]# cat dockerfile1 
FROM centos

VOLUME ["volume01","volume02"]

CMD echo "----end----"

CMD /bin/bash

docker build -f /home/docker-test-volume/dockerfile1 -t semon/centos:1.0 .

这种方式我们未来使用的十分多,因为我们通常会构建自己的镜像!

加上构建镜像是没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径!

数据卷容器

多个mysql同步数据!

# 创建3个容器 
docker run -it --name docker01 6204f9d0a976
docker run -it --name docker02 --volumes-from docker01 6204f9d0a976
docker run -it --name docker03 --volumes-from docker01 6204f9d0a976

多个mysql实现数据共享

结论:

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

但是一旦你持久化到了本地, 这个时候,本地的数据是不会删除的。

DockerFile

dockerfile 是用来构建docker镜像的文件! 命令参数脚本!

构建步骤:

1.编写一个dockerfile文件

2.docker build 构建成一个镜像

3.docker run 启动镜像

4.docker push 发布镜像(docker hub 阿里云镜像仓库!)

DockerFile 指令

FROM  #基础镜像, 一切从这里开始构建
MAINTAINER # 镜像是谁写的 姓名+邮箱
RUN # 镜像构建时需要运行的命令
ADD # 步骤 ,tomcat镜像 这个tomcat压缩包! 添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 dockerfile 这个时候就会运行ONBUILD 触发指令。
COPY # 类似ADD 将我们的文件拷贝到镜像中
ENV # 构建时设置环境变量。

实战测试 构建自己的centos

Docker Hub 中99% 镜像都是从这个基础镜像过来的

FROM scratch

构建自己的tomcat

docker 镜像发布的阿里云服务上

docker 网络

自定义网络

查看所有的docker网络

网络模式

brige: 桥接 docker默认 自己也使用这种

none : 不配置

host : 和宿主机共享网络

测试

# 我们直接启动的命令 --net bridge 也就是docker0
docker run -d -P --name tomcat01 --net bridge tomcat
#自己创建网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
[root@node1 ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
81418c65f58c8e25b75dec2fb488ff57f9ffd2a4974b5a579ab7a30a574cea41
[root@node1 ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e45daf867404   bridge    bridge    local
44921fd26c1b   host      host      local
81418c65f58c   mynet     bridge    local
2ca0b5f26d3c   none      null      local
​

[root@node1 ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
41bcc1f5d880ebfccee8162341a322da8b55d588eecebecb36d93544cfda4b90
[root@node1 ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
b162f55c30c942e8016c558bde0d68f4a4f1fdaeace7ede58f5a7d3d662734bb
[root@node1 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED         STATUS         PORTS                     NAMES
b162f55c30c9   tomcat    "catalina.sh run"   3 seconds ago   Up 2 seconds   0.0.0.0:49157->8080/tcp   tomcat-net-02
41bcc1f5d880   tomcat    "catalina.sh run"   8 seconds ago   Up 7 seconds   0.0.0.0:49156->8080/tcp   tomcat-net-01
​

网络连通

# 测试
# 一个容器2个ip 地址 例如阿里云 公网 私网
[root@node1 ~]# docker network connect mynet tomcat01
[root@node1 ~]# docker network connect mynet tomcat02
[root@node1 ~]# docker network inspect mynet
​

实战:部署Redis集群

shell 脚本!

Docker Compose

Docker compose 来轻松高效管理容器,定义运行多个容器。

安装

sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
​
#授权
sudo chmod +x /usr/local/bin/docker-compose
[root@node1 bin]# sudo chmod +x docker-compose 
[root@node1 bin]# docker-compose version
docker-compose version 1.29.2, build 5becea4c
docker-py version: 5.0.0
CPython version: 3.7.10
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019
​

测试 官方文档例子

地址 https://docs.docker.com/compose/gettingstarted/

python 应用,计数器,redis!

1、应用 app.py

2、Dockerfile 应用打包为镜像

3、Docker-compose yaml文件(定义整个服务,需要的环境,web,redis)

4、启动 docker-compose up

流程:

1、创建 网络

2、执行 yml文件

3、启动服务

yaml

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

Docker Swarm

Docker Stack

Docker Secret

Docker Config

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值