docker 使用

224 阅读12分钟

镜像(image)

docker 好比是一个模板,可以通过这个模板来创建容器服务, 通过这个镜像可以创建多个容器 它包括代码、运行时、库、环境变量、和配置文件 所以应用,直接打包docker 就可以直接跑起来

如何得到镜像:

1、从远程仓库下载

2、别人拷贝给你

3、自己制作一个镜像dockerfile

容器( container)

docker 利用容器技术,独立运行一个或者一组应用,通过镜像来创建。 启动,停止,删除,基本命令 可以把容器理解为一个简易的Linux系统

仓库(repository)

仓库就是存放镜像的地方; 仓库分为公有、私有仓库; Dock Hub (默认国外); 可配置镜像加速;

安装docker

环境准备: 1、一台远程服务器; 2、linux基础

环境查看: uname -r 5.10.23-5.al8.x86_64 需要系统内核版本 3.0 以上

安装:

1、卸载旧版本

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
download.docker.com/linux/cento…

//阿里云

yum-config-manager
--add-repo
mirrors.aliyun.com/docker-ce/l…

安装前建议更新索引:yum makecache fast

4、安装docker相关内容 ce社区版 ee企业版

yum install docker-ce docker-ce-cli containerd.io

5、启动docker

systemctl start docker

运行 hello-word 镜像

docker run hello-word image.png

6、查看下载的hello-word镜像 docker images

image.png

了解:卸载dock

1、删除依赖

yum remove docker-ce docker-ce-cli containerd.io

2、删除资源

rm -rf /var/lib/docker rm -rf /var/lib/containerd

阿里云镜像加速

1、登录阿里云 容器镜像服务

2、找到镜像工具-镜像加速地址

image.png

3、配置使用

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{ "registry-mirrors": ["28cqj8s9.mirror.aliyuncs.com"] }

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

底层原理

docker 是怎么工作的?

docker 是一个client-server 结构的系统,Docker的守护进程运行在主机上,通过socket从客户端访问

dockerServer接收到docker-client指令,就会执行命令

docker 为什么比vm虚拟机快?

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

2、docker利用的是宿主机的内核,vm需要是guest os

docker常用命令

帮助命令

docker version //显示版本信息
docker info //系统信息 包括镜像、容器数量
docker --help //帮助命令

镜像命令

docker imgages 查看本地主机上所以镜像

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   3 months ago   13.3kB

//解释
REPOSITORY 镜像仓库源
TAG        镜像标签
IMAGE ID   镜像id
CREATED    镜像创建时间
SIZE       镜像的大小
//可选项
Options:
  -a, --all    列出所有镜像
  -q, --quiet  只显示镜像的id

docker search 搜索镜像

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   11076     [OK]       
mariadb                           MariaDB Server is a high performing open sou…   4196      [OK]   

//可选项,通过收藏来过滤
--filter=STARTS=3000 搜索镜像STARTS大于3000的
例:docker search --filter=STARTS=3000

docker pull 下载镜像

docker pull 镜像名[:tag]
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker pull mysql
Using default tag: latest //如果不写tag 默认下载 latest最新版本
latest: Pulling from library/mysql
b4d181a07f80: Pull complete //分层下载 docker images核心 联合文件系统
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 等价于 docker.io/library/mysql:latest

//指定版本下载
docker pull mysql:5.7 //注意dockerhub中必须有相应的版本

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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 删除镜像

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f 容器id //指定id删除
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f 容器id 容器id 容器id //删除多个
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker rmi -f $(docker images -aq) //删除所有

容器命令

说明:有了镜像才能够创建容器,Linux,下载一个centos 镜像学习

docker pull centos

新建容器并启动

docker run [可选参数] image

//参数说明
--name="Name"  容器名字 tomcat01 tomcat02 用来区分容器
-d             后台方式运行
-it            使用交互方式运行 进入容器查看内容
-p             指定容器端口 -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-p             随机指定端口

测试 启动并进入容器

[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker run -it centos /bin/bash
[root@f6f595f3093b /]#

//查看内部centos 基础版本 很多命令不完善
[root@f6f595f3093b /]#  ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

//从容器退到主机
[root@f6f595f3093b /]# exit
exit
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# ls
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

列出运行的容器

docker ps      //列出当前正在运行的容器
docker ps -a   //列出历史运行的(运行过的)容器
docker ps -n=? //显示最近创建的容器
docker ps -q   //只显示容器的编号

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                       PORTS     NAMES
f6f595f3093b   centos         "/bin/bash"   4 minutes ago   Exited (130) 2 minutes ago             sharp_grothendieck
9dcc44056e5e   d1165f221234   "/hello"      25 hours ago    Exited (0) 25 hours ago                dreamy_hoover

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                       PORTS     NAMES
f6f595f3093b   centos    "/bin/bash"   6 minutes ago   Exited (130) 4 minutes ago             sharp_grothendieck

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps -aq
f6f595f3093b
9dcc44056e5e

退出容器

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

删除容器

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

启动和停止容器

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

常用其他命令

后台启动容器

//命令 docker run -d 镜像名
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d centos
3373f786dd0c63942c4cd1d279c7e05435bda8a41a9874cc8d1ada6c475865db

//问题 docker ps 发现 centos 停止了

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

//Nginx 容器启动后 发现自己没有提供服务 就会立刻停止服务

查看日志

docker logs -f -t --tails 容器,没有日志

//自己编写一段脚本
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d centos /bin/sh/ -c "while true;do echo gyyy;sleep 1;done"

//docker ps

//显示日志
-tf       //显示全部
--tail 10 //显示当前行数

docker logs -tf 容器id            //显示全部
docker logs -tf --tail 10 容器id  //要显示10条

查看容器中进程信息

//命令 docker top 容器id
top命令
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker top f529e616a615
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                23115               23095               0                   13:32               ?                   00:00:00   

查看镜像的元数据

//命令 docker inspect 容器id
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker inspect f529e616a615

[
    {
        "Id": "f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363",
        "Created": "2021-07-05T05:32:32.912152767Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 23115,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-07-05T05:32:33.211958643Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/hostname",
        "HostsPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/hosts",
        "LogPath": "/var/lib/docker/containers/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363/f529e616a61599c29f2a0345e98bed253006cad560529eb0938c04b955a15363-json.log",
        "Name": "/elated_euclid",
        "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/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5-init/diff:/var/lib/docker/overlay2/3f473c9d19bbc90907d8b0613f8f440b1a1ed40bd9824d9eacfb9ead6efc73c8/diff",
                "MergedDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/merged",
                "UpperDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/diff",
                "WorkDir": "/var/lib/docker/overlay2/011ec8ba5a367efd639168e2f8bfb07241e10a5d15a396e431c75d3482e612a5/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "f529e616a615",
            "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": "3dbdb08708dd4358aebd0ecc20c588089ba93ee518bc203080ebdab3af4a650c",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/3dbdb08708dd",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "8e0f21ed44a09e8f032b9b0e4dd52ad571515ab39d478e7614c039f0a0052541",
            "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": "49448b5ce7faf4d89e4095280fd9f01149ec62331df5c3cc7e804ba34ff4feb9",
                    "EndpointID": "8e0f21ed44a09e8f032b9b0e4dd52ad571515ab39d478e7614c039f0a0052541",
                    "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 bashShell

//测试 方式一
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
f529e616a615   centos    "/bin/bash"   10 minutes ago   Up 10 minutes             elated_euclid
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker exec -it f529e616a615 /bin/bash
[root@f529e616a615 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@f529e616a615 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 05:32 pts/0    00:00:00 /bin/bash
root        16     0  0 05:46 pts/1    00:00:00 /bin/bash
root        31    16  0 05:58 pts/1    00:00:00 ps -ef

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


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

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

docker cp 容器id:容器内路径 目标容器路径

//查看当前主机目录
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# ls
gaoyu.java
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS              PORTS     NAMES
605c0dbb0632   centos    "/bin/bash"   About a minute ago   Up About a minute             keen_goodall

//进入docker容器内部
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker attach 605c0dbb0632
[root@605c0dbb0632 /]# cd /home
[root@605c0dbb0632 home]# ls
//在容器内新建一个文件
[root@605c0dbb0632 home]# touch test.java
[root@605c0dbb0632 home]# ls
test.java
[root@605c0dbb0632 home]# exit
exit
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                       PORTS     NAMES
605c0dbb0632   centos    "/bin/bash"              3 minutes ago    Exited (0) 9 seconds ago   

//将文件拷贝出来到主机上
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker cp 605c0dbb0632:/home/test.java /home
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# lks
-bash: lks: command not found
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# ls
gaoyu.java  test.java

//拷贝是一个手动过程,未来我们使用 -v 卷的基数 实现自动同步 /home /home

docker 安装Nginx

1、搜索镜像 search
2、下载镜像 pull
3、启动Nginx
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    4f380adfc10f   12 days ago    133MB
centos       latest    300e315adb2f   6 months ago   209MB

//-d 后台运行
//--name 给容器命名
//-p 外部访问端口:容器内部端口
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d --name nginx01 -p 8888:80 nginx
f7cbce2c7b1395053741216b17a4c41bb7cb56a9054939320029d4911681b7e8
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                  NAMES
f7cbce2c7b13   nginx     "/docker-entrypoint.…"   7 seconds ago   Up 7 seconds   0.0.0.0:8888->80/tcp   nginx01

[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# curl localhost:8888
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>


可视化

//portainer(先用着)

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

//Rancher(CI/CD在用)

什么portainer?

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

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

访问测试:http://ip:8088

commit镜像

如何提交一个镜像

docker commit 提交容器成为一个新的版本

//命令和git原理类似 
//如果想保存当前容器的状态 可以通过commit提交获得一个镜像,就好比生成一个快照

docker commit -m='描述信息' -a='作者' 容器id 目标镜像名称:[TAG]

容器数据卷

什么是数据卷

如果数据都存在容器中 如果容器删除 数据就会丢失 需求:数据持久化

MySql 容器误删了 需求:数据可以储存再本地

容器之间可以有一个数据共享的技术!docker容器中生成的数据同步到本地! 如果容器删除数据还会存在,目录的挂载将我们容器的目录 挂载到Linux上面

使用数据卷

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

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

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

//启动起来后 通过docker  inspect 容器id 查看挂载

image.png

//镜像内添加文件后 同步到了主机相应挂载的目录 image.png //注意! 若停止容器 在主机上修改数据 容器内的数据也依旧是同步的 //好处:我们以后修改只需要在本机修改就可以了,不需要到容器内

安装mysql

MySQL数据持久化问题

//获取容器
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker pull mysql:5.7

//运行容器 需挂载目录,需配置密码 注意点!
官方:$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

测试自己启动:
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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=xxx --name mysql01 mysql:5.7
45fd3d33bcbd258733415e4d8dea75c9f229155991d70d40af64210cac437b74

//启动成功后使用navicat连接

//连接ip+3310连接成功

//在本机查看映射路径是否映射路径成功

//假设我们将mysql容器删除 查看本机发现数据并没有被删除 实现了数据持久化

具名、匿名卷挂载

匿名卷挂载

-v 容器内路径
docker run -d -p --name nginx01 -v /ect/nginx nginx

//查看所以的 volmne 情况
docker volume ls
local          dadawdwa1221edsadasdad12e21eawd31e3123e21d

//这里发现,这种就是匿名挂载,我们在-v只写了容器内路径没有写容器外主机路径

具名挂载

docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx nginx

//查看所以的 volmne 情况
docker volume ls
local          juming-nginx

//通过 -v 卷名:容器内路径
//查看一下

image.png

所以docker容器内的卷 没有指定目录的情况下都是在 '/var/lib/docker/volumes/xxxx'

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

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

拓展:

//可以通过 -v 容器内路径:ro  rw改变读写权限
ro   readonly  //只读
rw   redwrite  //可读写

//一旦设置了容器权限 容器对我们挂载出来的内容就有权限限制了
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 只能通过宿主机来操作,容器内无法操作

dockerFile镜像

dockerfile 是用来构建docker镜像文件的(命令脚本) 通过这个脚本可以生成镜像 镜像是一层层的 脚本一个个的命令 每个命令都是一层

//创建一个dockerfile文件 名字可以随机建议 dockerfile
//文件中的内容 指令(大写) 参数
FROM centos

VOLUME ["volume01","volume02"]
//发现问题
下面带/ 可以安装和运行不带只能安装不能运行
VOLUME ["/volume01","/volume02"]

CMD echo "...end..."
CMD /bin/bash

//这里每个命令 就是镜像的一层

image.png

//启动自己生成的镜像

image.png

数据卷容器

//启动三个容器 通过我们刚才创建的镜像启动

image.png

image.png

image.png

image.png

//测试 删除dockertest01 查看一下dockertest02和dockertest03是否还可以访问这个文件
//测试依旧可以访问

image.png

多个mysql、redis实现数据共享

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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=xxx --name mysql01 mysql:5.7

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=xxx --name mysql02 --volumes-from mysql01

//可以实现两个容器数据同步

结论:

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

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

dockerFile

dockerFile介绍

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

构建步骤:

1、编写一个dockerfile 文件

2、docker build 构建成一个镜像

3、docker run 运行镜像

4、docker push 发布镜像(dockerhub,阿里云镜像仓库)

很多官方镜像都是基础包,很多功能没有,我们通过自己搭自己的镜像;

官方既然可以制作镜像,我们也可以

dockerFile构建过程

基础:

1、每个保留关键字(命令)都是大写字母

2、执行从上到下顺序执行

3、#表示注释

4、每个指令会创建提交一个新的镜像层

image.png

dockerfile是面向开发的,我们一会要发布项目,做镜像,就需要编写dockerfile文件,这个文件十分简单

步骤:开发、部署、运维 缺一不可

docker镜像逐渐成为及企业交付的标准 必须掌握

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

dockerimages:通过dockerfile构建生成的镜像 最终要发布和运行的产品

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

docker的指令

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

image.png

创建自己一个dockerFrile:

dockerHub中99%都是从这个基础镜像过来的FROM scratch 然后配置需要的软件和配置来进行构建

image.png

//创建一个自己的centos

1编写dockerfile的文件
[root@iZ2zeexbrhzlc1zlxjcj6yZ dockerfile-centos]# vim mydockerfile
[root@iZ2zeexbrhzlc1zlxjcj6yZ dockerfile-centos]# cat mydockerfile
FROM centos
MAINTAINER gaoyu<xxxxxxxxx@qq.com>

ENV MYPATH /user/local
WORKDIR $MYPATH

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

EXPOST 80

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

2通过这个文件构建镜像
//命令 docker build -f dockerfile路径 -t 镜像名:[tag版本号] .

Successfully built 984397634b56
Successfully tagged mycentos:0.1

3测试运行

对比:之前的官方的centos

image.png 我们增加后的镜像:

image.png

可以列出本地进行的变更历史:

image.png

我们平时拿到一个镜像可以研究一下是如何实现的

//CMD 和 ENTRYPOINT 区别

dockerfile中很多命令都十分相似,我们需要了解其中的区别,最好方法时对比测试

开发步骤:

需要掌握dockerfile的编写

之后的一切都是使用docker镜像来发布运行

发布自己的镜像

发布到dockerhub

1、注册账号

2、确定账号可以登录

3、在我们服务器上提交自己的镜像

docker login --help

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# 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


[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker login -u gy2986589
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

4、登录完毕后就可以提交镜像了,就是异步 docker push

//docker push 注册用户名/镜像名

[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gy2986589/mycentos:0.1

//push镜像出现问题?
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gy2986589/mycentos:0.1
The push refers to repository [docker.io/gy2986589/mycentos]
An image does not exist locally with the tag: gy2986589/mycentos

//解决增加一个tag
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker tag 984397634b56 gaoyu/testcentos:1.0

//docker push 发布即可 一般记得要带版本号
[root@iZ2zeexbrhzlc1zlxjcj6yZ /]# docker push gaoyu/testcentos:1.0
The push refers to repository [docker.io/gaoyu/testcentos]
979ebdffcabe: Preparing 
1f1b9201c4ff: Preparing 
2cc2249a5e76: Preparing 
2653d992f4ef: Preparing 

发布到阿里云镜像

1、登录阿里云 2、找到容器镜像服务 3、创建命名空间 4、创建容器镜像 5、浏览阿里云信息

image.png

以下为上传成功

image.png

image.png

小结

image.png

docker 网络

理解docker0

image.png

三个网络

//问题 docker 如何处理容器的访问?

//查看容器内部的网络地址 ip addr

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

//我们发现这个容器带来网卡 都是一对对的
//ecth-pair 就是一对虚拟的设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
//整因为有这个特性 evth-pair 充当一个桥梁,链接各种虚拟网络设备的
//openStac,docker容器之间的连接,OVS的连接 都是使用evth-pair 技术

小结 docker 使用的是linux的桥接,宿主机中是一个docker官网的网桥 docker0。

image.png

docker中所有的网络接口都是虚拟的,虚拟的转发率搞!(内网传递文件!) 只要容器删除,对应网桥就没了

--link

//解决用容器名可以来访问容器

dockr exec -it tomcat02 ping tomcat01
结果:Name or service not know

docker run -d -p --name tocmcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
结果:成功 ping 通

docker inspect xxx

本质探究:--link就是我么再host配置中增加了一个 172.18.0.03

我们现在玩docker 已经不建议使用 --link了

自定义网络 不适用于 docker0

docker0问题:不支持容器名连接访问

自定义网络

查看所有的docker网络

image.png

网络模式

bridge:桥接docker(默认,自己创建的也使用此种模式)

none:不配置网络

host:和宿主机共享网络

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

测试

//我们启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -p --name tomcat01 tomcat
docker run -d -p --name tomcat01 --net bridge tomcat

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

//我们可以自定义一个网络
--driver bridge 桥接
--subnet 192.168.0.0/16 (192.168.0.2 - 192.168.255.255) 子网地址
--gateway 192.168.0.1 网关

[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[root@iZ2zeexbrhzlc1zlxjcj6yZ ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
49448b5ce7fa   bridge    bridge    local
a66a9a2a9144   host      host      local
7a267db013c3   mynet     bridge    local
8e836b2d0961   none      null      local

image.png

启动tomcat-net-01 和 02 查看mynet网络 发现01 02放到了 mynet中 image.png

//测试ping连接

[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.135 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.069 ms
//现在不使用--link 也可以ping名字了
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# 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.048 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.069 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=5 ttl=64 time=0.067 ms

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

好处:

redis 不同的集群使用不同的网络 保证集群是最安全和健康的

mysql 不同的集群使用不同的网络 保证集群是最安全和健康的

网络连通

image.png

直接ping是不通的因为用的是不同网络网段

[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d -P --name tomcat01 tomcat
88b45b16187c96ce447d4acb7d6b62d41dc4278f54f2858fe63bb84527537848
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker run -d -P --name tomcat02 tomcat
482d94abff78e8bc8076ae851a6c3a799325d239598060954f82e28847de9911
do[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS          PORTS                               NAMES
482d94abff78   tomcat      "catalina.sh run"        4 seconds ago    Up 2 seconds    0.0.0.0:49159->8080/tcp             tomcat02
88b45b16187c   tomcat      "catalina.sh run"        12 seconds ago   Up 11 seconds   0.0.0.0:49158->8080/tcp             tomcat01
74d384e22b2e   tomcat      "catalina.sh run"        14 minutes ago   Up 14 minutes   0.0.0.0:49157->8080/tcp             tomcat-net-02
f4c4581c11da   tomcat      "catalina.sh run"        14 minutes ago   Up 14 minutes   0.0.0.0:49156->8080/tcp             tomcat-net-01
4349e3b237c2   nginx       "/docker-entrypoint.…"   7 days ago       Up 7 days       0.0.0.0:8888->80/tcp                nginx01
45fd3d33bcbd   mysql:5.7   "docker-entrypoint.s…"   9 days ago       Up 9 days       33060/tcp, 0.0.0.0:3310->3306/tcp   mysql01
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# 

image.png

网络连接命令 image.png

//测试打通 tomcat01 - mynet

//连通后 就是将tomcat01 放到了 mynet 网络下

//一个容器两个ip地址  比如:阿里云服务器:公网ip 私有ip

image.png

//01 连通
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# 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.077 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.075 ms

//02依旧打不通
[root@iZ2zeexbrhzlc1zlxjcj6yZ home]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known

结论:假设要跨网络操作别人,就需要使用docker network connect 连通。

命令汇总

image.png

attach    Attach to a running container  #当前shell下attach连接指定运行镜像
build     Build an image from a Dockerfile  #通过Dockerfile定制镜像
commit    Create a new image from a containers changes  #提交当前容器为新的镜像
cp        Copy files/folders from a container to a HOSTDIR or to STDOUT  #从容器中拷贝指定文件或者目录到宿主机中
create    Create a new container  #创建一个新的容器,同run 但不启动容器
diff      Inspect changes on a containers filesystem  #查看docker容器变化
events    Get real time events from the server#从docker服务获取容器实时事件
exec      Run a command in a running container#在已存在的容器上运行命令
export    Export a containers filesystem as a tar archive  #导出容器的内容流作为一个tar归档文件(对应import)
history   Show the history of an image  #展示一个镜像形成历史

images    List images  #列出系统当前镜像
import    Import the contents from a tarball to create a filesystem image     #从tar包中的内容创建一个新的文件系统映像(对应export)
info      Display system-wide information  #显示系统相关信息
inspect   Return low-level information on a container or image  #查看容器详细信息
kill      Kill a running container  #kill指定docker容器
load      Load an image from a tar archive or STDIN  #从一个tar包中加载一个镜像(对应save)
login     Register or log in to a Docker registry#注册或者登陆一个docker源服务器
logout    Log out from a Docker registry  #从当前Docker registry退出
logs      Fetch the logs of a container  #输出当前容器日志信息
pause     Pause all processes within a container#暂停容器
port      List port mappings or a specific mapping for the CONTAINER  #查看映射端口对应的容器内部源端口
ps        List containers  #列出容器列表
pull      Pull an image or a repository from a registry  #从docker镜像源服务器拉取指定镜像或者库镜像
push      Push an image or a repository to a registry  #推送指定镜像或者库镜像至docker源服务器

rename    Rename a container  #重命名容器
restart   Restart a running container  #重启运行的容器
rm        Remove one or more containers  #移除一个或者多个容器
rmi       Remove one or more images  #移除一个或多个镜像(无容器使用该镜像才可以删除,否则需要删除相关容器才可以继续或者-f强制删除)
run       Run a command in a new container  #创建一个新的容器并运行一个命令
save      Save an image(s) to a tar archive#保存一个镜像为一个tar包(对应load)
search    Search the Docker Hub for images  #在dockerhub中搜索镜像
start     Start one or more stopped containers#启动容器
stats     Display a live stream of container(s) resource usage statistics  #统计容器使用资源
stop      Stop a running container  #停止容器
tag       Tag an image into a repository  #给源中镜像打标签
top       Display the running processes of a container #查看容器中运行的进程信息
unpause   Unpause all processes within a container  #取消暂停容器
version   Show the Docker version information#查看容器版本号
wait      Block until a container stops, then print its exit code  #截取容器停止时的退出状态值