Docker快速入门指南+多个案例详解(博主精心整理Dokcer+Docker Compose命令大全)

Docker详解


Docker概述

docker思想来自于集装箱,docker通过隔离机制,可以将服务器利用到极致

比较docker和虚拟化技术不同

  • 传统虚拟机,是虚拟出一个硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内核,容器是没有自己的内核的,也没有虚拟我们的硬件,所以轻便
  • 每个容器是互相隔离,每个容器都有一个属于自己的文件系统,互不影响

Docker名词解释及安装

docker名词

镜像(image):

docker镜像好比是一个模板,可以通过这个模板创建容器,通过这个模板可以创建多个容器

容器(container):

Docker利用容器技术,独立运行一个或一组应用,通过镜像来创建

仓库(repository):

仓库是存放镜像的地方,仓库分为 私有仓库与公有仓库

安装Docker

环境准备

  1. centos7
  2. xshell连接服务器进行操作
安装
# 1.安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
# 2. 配置镜像
yum-config-manager \
 	--add-repo \
 	http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 更新软件包索引
yum makecache fast

# 4. 安装docker相关依赖
yum -y install docker-ce docker-ce-cli containerd.io

# 5. 启动docker
systemctl start docker

# 6. 运行一个hello,worild
docker run heloo-world

# 7. 查看下载的docker镜像
docker images

#  卸载docker
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker

配置阿里云镜像加速
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://jkotkvmy.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker

底层原理

Docker是怎么工作的的

docker是一个Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问,DockerServer接受到Docker-Client的指令,就会执行这个命令

Docker为什么比VM快
  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,vm需要的是Guest OS
  3. 新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统,避免引导

Docker的常用命令

帮助命令

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

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

镜像命令

docker images 查看主机上的镜像
[root@student_test server]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    feb5d9fea6a5   13 months ago   13.3kB

#解释
REPOSITORY  镜像的仓库源
TAG         镜像的标签
IMAGE ID    镜像的ID
CREATE      镜像的创建时间
SIZE        镜像的大小

# 可选项
-a  --all              # 列出所有镜像
-q  --quiet			  # 只显示镜像的ID
docker search 搜索镜像
[root@student_test server]# docker search mysql
NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                           MySQL is a widely used, open-source relation…   13381     [OK]       
phpmyadmin                      phpMyAdmin - A web interface for MySQL and M…   664       [OK]       
bitnami/mysql                   Bitnami MySQL Docker Image                      78                   [OK]

# 可选项,通过搜索来过滤
--filter=starts=3000     搜索出来的镜像就是starts大于3000的
[root@student_test server]# docker search --filter=stars=3000  mysql
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13381     [OK]       
[root@student_test server]# docker search --filter=stars=5000  mysql
NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   13381     [OK]  

docker pull 下载镜像
# 下载镜像 docker pull 镜像名:[tag]
[root@student_test server]# docker pull mysql
Using default tag: latest    #如果不写tag,默认就是latest 最新版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete   # 分层下载,docker images 核心,联合文件系统
93619dbc5b36: Pull complete 
99da31dd6142: Pull complete 
626033c43d70: Pull complete 
37d5d7efb64e: Pull complete 
ac563158d721: Pull complete 
d2ba16033dad: Pull complete 
688ba7d5c01a: Pull complete 
00e060b6d11d: Pull complete 
1c04857f594f: Pull complete 
4d7cfa90e6ea: Pull complete 
e0431212d27d: Pull complete 
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5   # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest  #真实地址

# docker pull mysql 等价于它
docker pull docker.io/library/mysql:latest

# 指定版本下载
[root@student_test server]# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Already exists 
93619dbc5b36: Already exists 
99da31dd6142: Already exists 
626033c43d70: Already exists 
37d5d7efb64e: Already exists 
ac563158d721: Already exists 
d2ba16033dad: Already exists 
0ceb82207cd7: Pull complete 
37f2405cae96: Pull complete 
e2482e017e53: Pull complete 
70deed891d42: Pull complete 
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi 删除镜像
[root@student_test ]# docker rmi -f 镜像ID   # 删除指定的镜像
[root@student_test ]# docker rmi -f 镜像ID 镜像ID 镜像ID # 删除多个镜像
[root@student_test ]# docker rmi -f $(docker images -aq)  # 删除所有镜像

容器命令

说明:下载一个centos镜像来测试学习
docker pull centos
新建容器并启动
docker run [可选参数]  image

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

# 测试,启动并进入容器
[root@student_test /]# docker run -it centos /bin/bash
[root@4a689aa64511 /]# ls   # centos容器内,基础版本,很多命令不完善
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

# 从容器退回主机
[root@4a689aa64511 /]# exit
exit

列出所有运行的容器
# docker ps 命令
       # 列出正在运行的容器
-a     # 列出当前正在运行的容器,并显示历史运行的容器
-n=?   # 显示最近创建的容器
-q     # 只显示容器的编号

[root@student_test server]# docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS                     PORTS     NAMES
4a689aa64511   centos         "/bin/bash"   6 minutes ago   Exited (0) 2 minutes ago             beautiful_herschel
e34dd3bd2f5b   feb5d9fea6a5   "/hello"      7 hours ago     Exited (0) 7 hours ago               hopeful_booth
414f6bd7732d   feb5d9fea6a5   "/hello"      12 hours ago    Exited (0) 12 hours ago              zen_feistel

退出容器
exit      # 容器停止并退出
Ctrl+P+Q  # 容器不停止退出  
删除容器
docker rm 容器id                 # 删除指定容器,不能删除正在运行的容器,强制删除 rm -f
docker rm -f $(docker ps -aq)    #  删除所有容器
启动和停止容器的操作
docker start 容器id           # 启动容器
docker restart 容器id         # 重启容器
docker stop 容器id            # 停止容器
docker kill 容器id            # 强制停止容器

其他常用命令

后台启动容器
# 命令 docker run -d 镜像名
[root@student_test /]# docker run -d centos
11138413d3d8310c5c00609796c5ac9210c1a8cf5b8ece0e533cb6d5b27ae8af
[root@student_test /]# docker ps 
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# 问题: docker ps 发现 centos停止了

# 常见的坑: docker 容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
# 容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail 容器.没有日志

# 自己写一段shell脚本
[root@student_test /]# docker run -d centos /bin/bash  -c "while true;do echo dsb;sleep 1;done"
5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415
[root@student_test /]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
5e5fc252da0f   centos    "/bin/bash -c 'while…"   4 seconds ago   Up 4 seconds             gracious_darwin

# 显示日志
-tf     # 显示日志
--tail  # 显示日志条数
[root@student_test /]# docker logs -f -t --tail 100 5e5fc252da0f
查看容器的进程信息
docker top 容器ID
root@student_test /]# docker top 5e5fc252da0f
UID                 PID                 PPID                C                   STIME               TTY         
root                9663                9645                0                   23:09               ?               
root                10022               9663                0                   23:13               ?               

查看镜像的元数据
# 命令  docker inspect 容器ID

# 测试
[root@student_test /]# docker inspect 5e5fc252da0f
[
    {
        "Id": "5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415",
        "Created": "2022-10-24T15:09:05.475153779Z",
        "Path": "/bin/bash",
        "Args": [
            "-c",
            "while true;do echo dsb;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 9663,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2022-10-24T15:09:05.680407261Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/hostname",
        "HostsPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/hosts",
        "LogPath": "/var/lib/docker/containers/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415/5e5fc252da0f99f12cf44538cc22e17d9a64bdddbf562a6b393579a983686415-json.log",
        "Name": "/gracious_darwin",
        "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": [
                {
                    "Name": "nofile",
                    "Hard": 65535,
                    "Soft": 65535
                }
            ],
            "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/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e-init/diff:/var/lib/docker/overlay2/9d0f40ef82a77d7f14a66f30f9909d053d82c2fe76eb86805b444906894b48c4/diff",
                "MergedDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/merged",
                "UpperDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/diff",
                "WorkDir": "/var/lib/docker/overlay2/8662e6f29c99573f822c2213943fdd1706cfc7ac88017f09b35adca9a7282d8e/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "5e5fc252da0f",
            "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/bash",
                "-c",
                "while true;do echo dsb;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "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": "319ec876f19188d81b7e2dfceb539492de3116afb4fa257d0665fa131ee29bd7",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/319ec876f191",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "2cf2fd5552787e6ad8de1f4f1d3448f11bdbef6e1615edd33a2735745c5de6c6",
            "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": "993f8a8f607b993ae9a532566790f27b173492b32cc35a19061f025aaaf2d93a",
                    "EndpointID": "2cf2fd5552787e6ad8de1f4f1d3448f11bdbef6e1615edd33a2735745c5de6c6",
                    "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@student_test /]# docker exec -it 5e5fc252da0f /bin/bash
[root@5e5fc252da0f /]# ps -ef 
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 15:09 ?        00:00:00 /bin/bash -c while true;do ec
root       2310      0  1 15:47 pts/0    00:00:00 /bin/bash
root       2325      1  0 15:47 ?        00:00:00 /usr/bin/coreutils --coreutil
root       2326   2310  0 15:47 pts/0    00:00:00 ps -ef

# 方式2 
docker attach 容器ID
# 测试
[root@student_test /]# docker attach 5e5fc252da0f
正在执行的代码....



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

从容器内拷贝文件到宿主机
docker cp 容器ID:路径  宿主机目录

#查看当前主机目录下
[root@student_test home]# ls
atguigu  redset  shutdown1

#进入容器内部
[root@student_test home]# docker attach d930206b4358
[root@d930206b4358 /]# cd /home/
[root@d930206b4358 home]# ls
# 容器内新建一个文件
[root@d930206b4358 home]# touch test.java
[root@d930206b4358 home]# exit
exit
[root@student_test home]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@student_test home]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED              STATUS                      PORTS     NAMES
d930206b4358   centos    "/bin/bash"   About a minute ago   Exited (0) 18 seconds ago             gifted_hofstadter
# 将这个文件拷贝到主机
[root@student_test home]# docker cp d930206b4358:/home/test.java ./
[root@student_test home]# ls
atguigu  redset  shutdown1  test.java

# 拷贝是一个手动过程,未来使用 -v 卷的技术,可以实现互通

案例在这里插入图片描述

#  部署nginx
1. 搜索镜像
[root@student_test /]# docker search nginx
2. 下载镜像
[root@student_test /]# docker pull nginx
3. 运行测试
[root@student_test /]# docker run -d --name nginx01 -p 8080:80 nginx 
[root@student_test /]# curl localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
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>
# docker部署tomcat
docker run -it --rm tomcat:9.0
# 我们启动容器是后台启动,停止容器后,容器还能找到, 而这个命令一般用来测试,用完即删

1. 下载
[root@student_test /]# docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat

2. 启动容器
[root@student_test /]# docker run -d --name tomcat01 -p 8081:8080 tomcat

3. 测试访问
# 发现报404,进入容器查看,发现tomcat镜像是最小版
[root@student_test /]# docker exec -it tomcat01 /bin/bash
root@12f88257f07e:/usr/local/tomcat# ls
BUILDING.txt	 README.md	conf		temp
CONTRIBUTING.md  RELEASE-NOTES	lib		webapps
LICENSE		 RUNNING.txt	logs		webapps.dist
NOTICE		 bin		native-jni-lib	work
root@12f88257f07e:/usr/local/tomcat# cd webapps
root@12f88257f07e:/usr/local/tomcat/webapps# ls
root@12f88257f07e:/usr/local/tomcat/webapps# 
# 工程目录内没有文件,将webapps.dist文件复制到webapps内即可

# 部署 ES+Kibana
1.下载并启动
[root@student_test /]# docker run -d --name ES01 -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms100m -Xmx300m" elasticsearch:7.6.0
#-e属性设置
#比如discovery.type设置为单节点模式
#注意:ES_JAVA_OPTS 是设置ES内存的

2. 测试
[root@student_test /]# curl localhost:9200
{
  "name" : "a787602ef1f7",
  "cluster_name" : "docker-cluster",
  "cluster_uuid" : "w001VcMQSFKLSo96BNneIA",
  "version" : {
    "number" : "7.6.0",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "7f634e9f44834fbc12724506cc1da681b0c3b1e3",
    "build_date" : "2020-02-06T00:09:00.449973Z",
    "build_snapshot" : false,
    "lucene_version" : "8.4.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}


Docker镜像讲解

镜像是什么

镜像是一种轻量级,可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时的库、环境变量和配置文件
如何得到镜像:
	远程仓库取
	另外的主机拷贝
	自己制作

Docker镜像加载原理

UnionFS(联合文件系统)
Union文件系统是一种分层,轻量级并且高性能的文件系统,它支持对文件系统的修改作为一场提交来以层层叠加,我们使用 docker pull 命令下载时所看到的一层层下载就是这个.Union同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Docker镜像的基础,镜像可以通过分层进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件叠加起来,这样最终的文件系统会包含所有底层的文件和目录
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS
分层理解
可以去下载一个镜像,观察日志的输出,可以看到是一层一层下载

在这里插入图片描述

思考:为什么Docker镜像采用这种分层结构呢

最大的好处,我觉得莫过于是资源共享,如有多个镜像从相同的Base镜像构建而来,那么宿主机只需要再磁盘上保留一份Base镜像,同时内存也只需要加载一份Base镜像,就可以为所有容器服务,镜像的每一层都可以被共享
查看镜像分层命令可用: docker inspect images

在这里插入图片描述

特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层就是容器层,容器之下都叫镜像层

commit 镜像

docker commit 提交容器成为一个新的版本
docker commit -m="提交的描述信息" -a="作者" 容器ID  目标镜像名:[TAG]

测试

# 启动一个默认的tomcat
# 默认的tomcat webapps下没有文件
# 自己拷贝文件进去,重新打包

在这里插入图片描述

容器数据卷

什么是容器数据卷
如果数据在容器内,那么容器删除,数据就会丢失.
容器之间有一个数据共享的技术,Docker容器中产生的数据同步到本地,简单来说就是一个目录的挂载,将容器内的目录挂载到本地
容器的持久化和同步操作,容器间也可以数据共享

使用数据卷
命令挂载方式
docker run -it -v 主机目录:容器目录 
#测试
[root@student_test ~]# docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动后,可以通过 docker inspect 容器名 | grep  -A 10 Mounts  来查看
 
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",
                "Destination": "/home",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

测试文件的同步

在这里插入图片描述

# 测试
容器停止后,在本机修改共享目录下的文件依然会同步到容器内
测试:部署mysql
# 运行容器,需要数据挂载,启动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

# 查看所有卷的情况
[root@student_test data]# docker volume ls
DRIVER    VOLUME NAME
local   844ced237db201903c160c994d99ed03499806be8e16f8fad8af41cecfe9dc2b
# 这里发现,这种就是匿名挂载,我们 -v 只写了容器内的路径,没有写容器外路径

# 具名挂载
[root@student_test data]# docker run -d -P -v juming-nginx:/etc/nginx --name nginx01 nginx
a0755b5217fba5f756227bf5577297683d4bd2ff86017cc6fba7767bfb439621
[root@student_test data]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx

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

在这里插入图片描述

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

在这里插入图片描述

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

拓展:

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

# 一旦设置了容器的权限,容器对我们挂载出来的内容就有限制了
docker run -d -P -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P -v juming-nginx:/etc/nginx:rw nginx

# ro 说明只能通过宿主机来操作
初识DockerFile

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

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

# 创建一个dockerfile文件
# 文件中的内容
FROM centos

VOLUME ["volume01","volume02"]

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

在这里插入图片描述

通过dockerfile创建一个镜像

在这里插入图片描述

数据卷容器

在这里插入图片描述

# 启动两个容器,用之前创建的镜像

在这里插入图片描述

在centos01创建文件
请添加图片描述

启动centos02,并在centos02查看

请添加图片描述

通过–volumes-from 可以实现容器之间数据共享

# 删除centos01后,centos02内的test文件依旧可以访问
# --volumes-from 类似于拷贝的一个概念

多个mysql实现数据共享

# docker run -d -p 3310:3306 -v /etc/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
# docker run -d -p 3310:3306  -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7

# 这个时候可以实现两个容器数据同步

结论:

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

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

DockerFile

dockerfile 用来构建镜像的文件,命令参数脚本
构建步骤:
1. 编写一个dockerfile文件
2. docker build 构建出一个镜像
3. docker run 运行镜像
4. docker push 发布镜像(dockerhub,阿里云镜像仓库)

Dockerfile构建过程

基础知识:

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

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

DockerImages: 通过DockerFile构建成的镜像,最终发布和运行的产品

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

Dockerfile的指令

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

请添加图片描述

实战测试

# 创建一个自己的Centos
FROM centos:7    # 这里需指定跟本机版本的,最新的8,使用yum命令会报错

MAINTAINER yzs<3131445883@qq.com>

ENV mypath /usr/local
WORKDIR $mypath

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

EXPOSE 80

CMD /bin/bash

# 通过这个文件构建镜像
docker build -f centos_dockerfile -t mycentos:1.0 .

# 启动这个镜像
[root@student_test dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mycentos     1.0       17d8af68e551   5 minutes ago   626MB
nginx        latest    605c77e624dd   10 months ago   141MB
tomcat       latest    fb5657adc892   10 months ago   680MB
mysql        5.7       c20987f18b13   10 months ago   448MB
centos       7         eeb6ee3f44bd   13 months ago   204MB
[root@student_test dockerfile]# docker run -it 17d8af68e551

我们可以列出镜像的变更历史

请添加图片描述

#  CMD 和 ENTRYPOINT 的区别
1. CMD是替换,在执行 docker run的时候后面跟的命令会替换掉CMD定义的,例 docker run -it images -l
2. ENTRYPOINT是追加,在执行 docker run的时候后面跟的命令会追加进ETNRYPOINT定义的,例 docker run -it images -l

实战:Tomcat镜像

  1. 准备镜像文件,tomcat压缩包,jdk压缩包
  2. 编写dockerfile文件,官方命名: Dockerfile ,build会自己去找,不用自己定义了
# 1.定义dockerfile文件
[root@student_test dockerfile]# cat Dockerfile 
FROM centos:7

MAINTAINER yzs<3131445883@qq.com>

COPY readme.txt /usr/lcoal

ADD jdk-8u231-linux-x64.tar.gz /usr/local
ADD apache-tomcat-8.5.57.tar.gz /usr/local

WORKDIR /usr/local/

ENV JAVA_HOME=/usr/local/jdk1.8.0_231/
ENV CLASSPATH=$JAVA_HOME/lib
ENV PATH=$PATH;$JAVA_HOME/bin

RUN yum -y install vim

EXPOSE 8080

CMD /usr/local/apache-tomcat-8.5.57/bin/startup.sh && tail -f /usr/local/apache-tomcat-8.5.57/logs/catalina.out


# 2. 编译
[root@student_test dockerfile]# docker build -t mytomcat .


# 3. 运行
[root@student_test dockerfile]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
mytomcat     latest    558e9c60c4c0   7 seconds ago       860MB
mycentos     1.0       17d8af68e551   About an hour ago   626MB
nginx        latest    605c77e624dd   10 months ago       141MB
tomcat       latest    fb5657adc892   10 months ago       680MB
mysql        5.7       c20987f18b13   10 months ago       448MB
centos       7         eeb6ee3f44bd   13 months ago       204MB
[root@student_test dockerfile]# docker run -d -p 9090:8080 -v /home/dockerfile/test:/usr/local/apache-tomcat-8.5.57/webapps/ 558e9c60c4c0

发布镜像

  1. 地址:https://hub.docker.com/ 注册并登录
  2. 在我们服务器上提交镜像
[root@student_test ~]# 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
  1. 登陆完毕后,就可以提交镜像了 docker push
[root@student_test ~]# docker push mytomcat
Using default tag: latest
The push refers to repository [docker.io/library/mytomcat]
0819256cb14e: Preparing 
4f79a941deda: Preparing 
89506895e1ce: Preparing 
b1f1129f0cd7: Preparing 
174f56854903: Preparing 
denied: requested access to the resource is denied
# push失败

[root@student_test ~]# docker push axxbox/mytomcat:1.0
The push refers to repository [docker.io/axxbox/mytomcat]
0819256cb14e: Pushing  79.03MB/238.4MB
4f79a941deda: Pushing  15.09MB
89506895e1ce: Pushing  124.2MB/402.7MB
b1f1129f0cd7: Pushing  2.048kB
174f56854903: Pushing  17.92MB/203.9MB
# 构建镜像是指定镜像名为 Dockerhub_UserName/image_name:tag


发布到阿里云仓库
  1. 登录阿里云
  2. 找到容器镜像服务
  3. 创建命名空间

请添加图片描述

  1. 创建容器镜像

请添加图片描述

  1. 浏览阿里云

请添加图片描述

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/yzs_images/yzs_test:[镜像版本号]
 docker push registry.cn-hangzhou.aliyuncs.com/yzs_images/yzs_test:[镜像版本号]

Docker网络

理解Docker网络

三个网络地址

请添加图片描述

–Link
[root@student_test ~]# docker exec -it tomcat01 ping tomcat02
ping:  tomcat01: Name ot service not Konw

# 如何通过名字来访问容器


# 通过--link解决
[root@student_test ~]# docker run -it --name centos01 --link tomcat01 eeb6ee3f44bd
[root@student_test ~]# docker exec -it centos01 ping tomcat01
PING tomcat01 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.091 ms

# 反向ping,由 tomcat01 ping centos01 是ping不通的

# 原理探究,通过查看centos01的host文件发现
[root@student_test ~]# docker exec -it centos01 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.2	tomcat01 d0276e2cd28d
172.17.0.4	6c62ab7c1fed


#  --link 操作就是在hosts文件中增加了一个地址对应,真是环境内,已经不建议使用--link

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

自定义网络

查看所有的docker 网络

请添加图片描述

网络模式:

  1. bridge: 桥接(默认,自定义也用)
  2. none: 不配置网络
  3. host: 主机模式,和宿主局共享网络
  4. container: 容器网络连通(用得少,局限大)
# 我们默认直接启动命令用的是 --net bridge ,这个就是docker0
docker run -d -P  --name tomcat01 tomcat
docker run -d -P --net bridge --name tomcat01 tomcat

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

# 自定义一个网络
# --driver bridge
# --subnet
[root@student_test ~]# docker network create --driver bridge --subnet 172.16.0.0/16 --gateway 172.16.0.1 mynet
0cf3d1091367003e0da56b8fe2533e5eb0b9da08975550e72c90b3dc294d58b4
[root@student_test ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f9084b1d5afd   bridge    bridge    local
33362e1286a8   host      host      local
602074b40a59   jms_net   bridge    local
0cf3d1091367   mynet     bridge    local
a9ddbf4ec3aa   none      null      local

请添加图片描述

启动两个容器设置网络为自定义的网络
[root@student_test ~]# docker run -it --name centos02 --net mynet centos:7
WARNING: IPv4 forwarding is disabled. Networking will not work.

# 进行测试
[root@student_test ~]# docker exec -it centos01 ping centos02
PING centos02 (172.16.0.3) 56(84) bytes of data.
64 bytes from centos02.mynet (172.16.0.3): icmp_seq=1 ttl=64 time=0.094 ms
^C
--- centos02 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.094/0.094/0.094/0.000 ms
[root@student_test ~]# docker exec -it centos02 ping centos01
PING centos01 (172.16.0.2) 56(84) bytes of data.
64 bytes from centos01.mynet (172.16.0.2): icmp_seq=1 ttl=64 time=0.045 ms
^C
--- centos01 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.045/0.045/0.045/0.000 ms

# 使用自定义网络,也能达到--link的效果

mynet下新添加的两个ip,就是新增的两台容器

请添加图片描述

网络连通

请添加图片描述

请添加图片描述

# 测试,打通tomcat01 到 mynet
#新增容器 tomcat01并打通到mynet
[root@student_test ~]# docker run -d -P --name tomcat01 tomcat
WARNING: IPv4 forwarding is disabled. Networking will not work.
3abc1c5a2b22acaa4d3bda973fa99cac0aedc877fe0962f3742fed76291ffaf1
[root@student_test ~]# 
[root@student_test ~]# docker network connect mynet tomcat01

# 连通之后就是将tomcat01 取到了 mynet网络下

# 一个容器两个ip

请添加图片描述

# 连通
[root@student_test ~]# docker exec -it centos01  ping tomcat01
PING tomcat01 (172.16.0.4) 56(84) bytes of data.
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=1 ttl=64 time=0.097 ms
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=2 ttl=64 time=0.063 ms
64 bytes from tomcat01.mynet (172.16.0.4): icmp_seq=3 ttl=64 time=0.069 ms

Docker 命令大全(博主精心整理,包含Docker Compose)

请添加图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烤羊肉的逵妹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值