Docker学习一

Docker

Docker安装

Docker基本组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OXU3MBKN-1600152947989)(https://s1.ax1x.com/2020/07/19/UWrErV.jpg)]

  1. 镜像(image):

    相当于一个模板,可以通过这个模板来创建容器服务。通过镜像可以创建多个容器。

  2. 容器(container):

    Docker利用容器技术,独立运行一个或一组应用

  3. 仓库(repository):

    存放镜像的地方。

    分为公有仓库和私有仓库。

安装

https://docs.docker.com/get-docker/

Docker常用命令

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

帮助命令

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

镜像命令

docker images # 查看所有本地主机上的镜像

C:\Users\wangzg>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redislabs/rebloom   latest              03841e395ca0        7 days ago          104MB
mongo               latest              6d11486a97a7        12 days ago         388MB
mysql               5.7                 9cfcce23593a        5 weeks ago         448MB

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

# 可选项
-a, --all      # 列出所有镜像
-q, --quiet    # 只显示镜像的id

docker search 搜索镜像

C:\Users\wangzg>docker search redis
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                            Redis is an open source key-value store that…   8389                [OK]

# 可选项
--filter=STARS=3000   搜索出来的景象是starts大于3000的

docker pull下载镜像

# 下载镜像docker pull <image_name> [:tag],默认是最新版,tag可指定版本

C:\Users\wangzg>docker pull hello-world
Using default tag: latest  # 默认是最新版
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete                                                                                                                   
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest  # 真实地址

# 下面两句等价
docker pull hello-world
docker pull docker.io/library/hello-world:latest

docker rmi删除镜像

#删除指定容器 docker rmi -f <image_name> 或 docker rmi -f <image_id>
#删除多个容器 docker rmi -f <image_id> <image_id> <image_id>
#删除全部容器 docker rmi -f $(docker images -aq)

容器命令

  • 有了镜像才能创建容器。下载一个centos测试学习
docker pull centos

新建容器并启动

docker run [可选参数] image

# 参数说明
--name="Name"  容器名字
-d             后台运行
-it            交互方式运行,进入容器
-p             指定容器端口
   -p ip:主机端口:容器端口
   -p 主机端口:容器端口
   -p 容器端口
   容器端口
-P             随机指定端口
#  测试,启动并进入容器
C:\Users\wangzg>docker run -it centos /bin/bash
[root@c1ad31123d52 /]#

#  从容器中退回主机
[root@c1ad31123d52 /]# exit
exit

C:\Users\wangzg>

列出所有运行的容器

# docker ps命令,默认显示正在运行的容器
-a    # 列出正在运行的容器和历史运行的容器
-n=?  # 显示最近创建的容器
-q    # 只显示容器的id

退出容器

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

删除容器

docker rm <CONTAINER_ID>         # 删除指定的容器,不能删除正在运行的容器,-f强制删除
docker rm -f $(docker ps -aq)    # 删除所有容器
docker ps -a -q|xargs docker rm  # 删除所有容器

启动和停止容器

docker start <CONTAINER_ID>    # 启动容器
docker restart <CONTAINER_ID>  # 重启容器
docker stop <CONTAINER_ID>     # 停止当前容器
docker kill <CONTAINER_ID>     # 强制停止当前容器

常用其他命令

后台启动容器

# 命令docker run -d <image_name>
docker run -d centos

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

查看日志

docker logs -tf --tail <number> <container_id>  # 显示指定number行数的日志

查看容器中的进程信息

docker top <container_id>

查看容器元数据

docker inspect <container_id>

C:\Users\wangzg>docker inspect 02537670ce44
[
{
“Id”: “02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67”,
“Created”: “2020-07-19T13:11:34.985655152Z”,
“Path”: “/bin/bash”,
“Args”: [],
“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 2706,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2020-07-19T13:11:35.195469536Z”,
“FinishedAt”: “0001-01-01T00:00:00Z”
},
“Image”: “sha256:831691599b88ad6cc2a4abbd0e89661a121aff14cfa289ad840fd3946f274f1f”,
“ResolvConfPath”: “/var/lib/docker/containers/02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67/resolv.conf”,
“HostnamePath”: “/var/lib/docker/containers/02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67/hostname”,
“HostsPath”: “/var/lib/docker/containers/02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67/hosts”,
“LogPath”: “/var/lib/docker/containers/02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67/02537670ce44fef47b2260472f8b6cbfee965a4b3061e268396fe33b4520bb67-json.log”,
“Name”: “/nervous_hellman”,
“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,
“Capabilities”: null,
“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”: [
30,
142
],
“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/837eed7e3e73fc6968caf5442fab58b18ceee8daa4e377d3add9a1d76fa1a3ea-init/diff:/var/lib/docker/overlay2/ae22fdf1b9ff321ba01c5e4ed7e0d4a526820438bcd753f0c1354455550f9d83/diff”,
“MergedDir”: “/var/lib/docker/overlay2/837eed7e3e73fc6968caf5442fab58b18ceee8daa4e377d3add9a1d76fa1a3ea/merged”,
“UpperDir”: “/var/lib/docker/overlay2/837eed7e3e73fc6968caf5442fab58b18ceee8daa4e377d3add9a1d76fa1a3ea/diff”,
“WorkDir”: “/var/lib/docker/overlay2/837eed7e3e73fc6968caf5442fab58b18ceee8daa4e377d3add9a1d76fa1a3ea/work”
},
“Name”: “overlay2”
},
“Mounts”: [],
“Config”: {
“Hostname”: “02537670ce44”,
“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”: “20200611”,
“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”: “bb57836f0ad2f95ecb609f7cb527d0fdf6ed8b0434e018ff65928f045a968349”,
“HairpinMode”: false,
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“Ports”: {},
“SandboxKey”: “/var/run/docker/netns/bb57836f0ad2”,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null,
“EndpointID”: “80962e89e3467c8b8c5d53527518b98e2e6fd2b90785f0c762d9bacde883f25f”,
“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”: “f117a0ac3c4823700030dd427cfd19fa7ec549139845bc7984559149eccfde4c”,
“EndpointID”: “80962e89e3467c8b8c5d53527518b98e2e6fd2b90785f0c762d9bacde883f25f”,
“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 <container_id> bash_shell
C:\Users\wangzg>docker exec -it 02537670ce44 /bin/bash
[root@02537670ce44 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@02537670ce44 /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:11 pts/0    00:00:00 /bin/bash
root        14     0  0 13:16 pts/1    00:00:00 /bin/bash
root        28    14  0 13:16 pts/1    00:00:00 ps -ef

# 方式二:docker attach <container_id>
C:\Users\wangzg>docker attach 02537670ce44
# 正在执行当前的代码程序,不是新的窗口


# docker exec   # 进入容器后可以开一个新的终端
# docker attach # 进入容器正在执行的终端,不会启动新的终端

从容器拷贝文件到主机上

docker cp <container_id>:<容器内路径> <目的主机路径>

Docker命令图示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ksiJ8kG9-1600152947992)(https://s1.ax1x.com/2020/07/19/UWTaFA.png)]

部署Nginx和Tomcat

部署Nginx
C:\Users\wangzg>docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8559a31e96f4: Already exists                   
1cf27aa8120b: Pull complete                                                                             67d252a8c1e1: Pull complete                                                                             9c2b660fcff6: Pull complete
4584011f2cd1: Pull complete
Digest: sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

C:\Users\wangzg>docker run -d --name nginx01 -p 3344:80 nginx
5ccbc89552f2d2bd753f2ab2d01d7af59a22454f61a88eda95b13446f7e5a147

C:\Users\wangzg>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
5ccbc89552f2        nginx               "/docker-entrypoint.…"   4 seconds ago       Up 4 seconds        0.0.0.0:3344->80/tcp   nginx01

# 进入容器
C:\Users\wangzg>docker exec -it nginx01 /bin/bash
root@5ccbc89552f2:/# 

访问http://localhost:3344/可显示Welcome to nginx!信息表示部署成功。

部署Tomcat
C:\Users\wangzg>docker pull tomcat
Using default tag: latest
latest: Pulling from library/tomcat
e9afc4f90ab0: Pull complete
989e6b19a265: Pull complete
af14b6c2f878: Pull complete
5573c4b30949: Pull complete
fb1a405f128d: Pull complete
612a9f566fdc: Pull complete
4226f9b63dac: Pull complete
cb8bfe875d7f: Pull complete
5aa366608b6d: Pull complete
4b7c9018ca5f: Pull complete
Digest: sha256:46456ccf216f2fde198844d5c7d511f60e3ffc2ea3828e0cce9a2eed566e48e2
Status: Downloaded newer image for tomcat:latest
docker.io/library/tomcat:latest

C:\Users\wangzg>docker run -d -p 3355:8080 --name tomcat01 tomcat
e868dfd6125080b91f9cf1590e4a802f8f46b1d4f65e747db9d3442276a05925

C:\Users\wangzg>docker exec -it tomcat01 /bin/bash
root@e868dfd61250:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work
root@e868dfd61250:/usr/local/tomcat#

Docker镜像

镜像

  • 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

  • 得到镜像的方式

    1. 远程仓库下载
    2. 拷贝
    3. 自己制作DockerFile

Docker镜像加载原理

UnionFS(联合文件系统)
  • Union文件系统是一种分层、轻量级并且高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同的目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像)可以制作各种具体的应用镜像。
  • 特性:一次同时加载多个文件系统,但从外面看起来只能看到一个文件系统,联合加载会把各层文件系统叠加起来,最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
  • docker镜像实际上由一层层的文件系统组成(UnionFS)
    • bootfs(boot file system)主要包含bootloader和kernel。bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在docker镜像的最底层就是bootfs。当boot加载完成之后整个内核就在内存中了,此时内存的使用权已经由bootfs交给内核,此时系统会卸载bootfs。
    • rootfs(root file system),在bootfs之上。包含的就是典型的Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同操作系统发行版,如Ubuntu,Centos等。
分层理解

【例】pull一个redis镜像

如下就是分层下载的过程

C:\Users\wangzg>docker pull redis
Using default tag: latest
latest: Pulling from library/redis
8559a31e96f4: Already exists
85a6a5c53ff0: Already exists
b69876b7abed: Already exists
a72d84b9df6a: Already exists
5ce7b314b19c: Already exists
04c4bfb0b023: Already exists                
Digest: sha256:800f2587bf3376cb01e6307afe599ddce9439deafbd4fb8562829da96085c9c5
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest

然后docker inspect redis:latest查看该镜像的信息,其中的RootFS字段就是分段信息

        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:13cb14c2acd34e45446a50af25cb05095a17624678dbafbcc9e26086547c1d74",
                "sha256:e6b49c7dcaac7a2ec2acc379da5f5b1bcc6a5d3badd72814fe945296216557bd",
                "sha256:cdaf0fb0082b74223a224c39c2d2ea886c32f53b7e1d5b872d5354aae0df56b8",
                "sha256:72d3a7e6fe022824ee2f852ca132030e22c644fbaf8287f4ea8044268abe40b7",
                "sha256:67c707dbd847d8310d3b988c3e3d9d9eb53387ede0de472e36a15abbcb6c719c",
                "sha256:7b9c5be81844318508f57a5b0574822dabaaed3dc25ee35d960feec3a9e941c4"
            ]
        }
理解
  • 所有的Docker镜像都起始于一个基础镜像层,当进行修改或添加新内容时就会在当前镜像层之上创建新的镜像层。
  • 当添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。
  • Docker镜像默认都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部。这一层就是容器层,容器之下的都是镜像层。
commit镜像
docker commit -m="description" -a="author" <container_id>[:tag]

【测试】

# 启动一个默认的tomcat容器
C:\Users\wangzg>docker run -it -p 8080:8080 tomcat
# ctrl+P+Q退出容器,容器不停止
# 进入容器交互
C:\Users\wangzg>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
45316cf5e6c5        tomcat              "catalina.sh run"   47 seconds ago      Up 47 seconds       0.0.0.0:8080->8080/tcp   jolly_knuth

C:\Users\wangzg>docker exec -it 45316cf5e6c5 /bin/bash
root@45316cf5e6c5:/usr/local/tomcat# ls
BUILDING.txt     LICENSE  README.md      RUNNING.txt  conf  logs            temp     webapps.dist
CONTRIBUTING.md  NOTICE   RELEASE-NOTES  bin          lib   native-jni-lib  webapps  work

# 这一步其实就是部署web应用
root@45316cf5e6c5:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@45316cf5e6c5:/usr/local/tomcat# cd webapps
root@45316cf5e6c5:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@45316cf5e6c5:/usr/local/tomcat/webapps# exit
exit

# 把部署好应用的容器提交为一个新的镜像
C:\Users\wangzg>docker commit -a="wangzg" -m="add web app" 45316cf5e6c5 tomcat2:1.0
sha256:aecc0ffd8d0b17e21d313a9e1675e9b430a6113705618891a6a256f881c02344

# 检查刚刚提交的新镜像tomcat2的信息
C:\Users\wangzg>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat2             1.0                 aecc0ffd8d0b        8 seconds ago       652MB
tomcat              latest              df72227b40e1        3 days ago          647MB

容器数据卷

概念

  • 容器的持久化和同步操作。

  • Docker容器中产生的数据同步到本地。即目录的挂载,将容器内的目录挂载到(本地系统)linux上面。

  • 容器间也是可以数据共享的。

使用

方式一:直接使用命令来挂载
docker run -it -v <主机上的目录>:<容器内目录> <容器id>

查看挂载信息

docker inspect <容器id>  # 查看其中的Mounts字段信息
  • 使用具名和匿名挂载
# 匿名挂载 -v <容器内目录>
docker run -d -P --name nginx01 -v /etc/nginx nginx

# 具名挂载 -v <卷名>:<容器内目录>
docker run -d -P --name nginx02 -v juming:/etc/nginx nginx

# 查看所有的卷的情况
docker volume ls

# 使用inspect查看挂载的具体信息
docker inspect 

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

  • 补充
# 通过 -v <容器内路径>:ro  rw改变读写权限
# ro  read only
# rw  readwrite
docker run -d -P --name nginx01 -v juming:/etc/nginx:ro nginx
docker run -d -P --name nginx01 -v juming:/etc/nginx:rw nginx

# ro 此时这个路径只能通过宿主机操作,容器内部无法操作
方式二:DockerFile

DockerFile

  • 用来构建Docker镜像的构建文件

Dockers网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值