目录
Docker入门
什么是docker:是一个容器,将程序打包隔离,可以粗糙的理解为一个轻量级的虚拟机(的确不是虚拟机 少一个Docker Engine),Docker解决了软件包装的问题。
Docker 镜像(Image)是一个专用的文件系统,你可以将其理解为一个可执行程序,其包含容器运行所需的代码、运行环境、依赖库、环境变量和配置文件等该程序启动和运行所必须的资源。Docker 容器(Container)是镜像(Image)运行(docker run)时产生的实例,容器可以被创建、启动、停止、暂停、删除等。而 Docker 就是一个容器引擎,管理着众多的容器。
mac安装docker:进入docker.com官网、点击 Get Started
linux安装docker:
sudo wget -qO- https://get.docker.com | sh
sudo usermod -aG docker xbf
docker架构介绍与实战
Client 通过命令向 docker_host 中的 Docker deamon 发起指令,Docker deamon 会操作镜像,Registry是互联网的SaaS服务 可以托取、push Images,可以使所有docker用户共享镜像的服务。
// 输入一条指令 用Ubuntu的Images输出 hello docker
GoogoldeMacBook-Pro:/ googol$ docker run ubuntu echo hello docker
hello docker
// 查看本地所有images
GoogoldeMacBook-Pro:/ googol$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest f643c72bc252 12 days ago 72.9MB
ubuntu 15.10 9b9cb95443b5 4 years ago 137MB
// 查看当前正在运行的images
GoogoldeMacBook-Pro:/ googol$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
// 查看所有的images
GoogoldeMacBook-Pro:/ googol$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
// 输入一条指令 运行nginx服务
GoogoldeMacBook-Pro:/ googol$ docker run -p 8080:80 -d daocloud.io/nginx
Unable to find image 'daocloud.io/nginx:latest' locally
latest: Pulling from nginx
bf5952930446: Pull complete
cb9a6de05e5a: Pull complete
9513ea0afb93: Pull complete
b49ea07d2e93: Pull complete
a5e4a503d449: Pull complete
Digest: sha256:179412c42fe3336e7cdc253ad4a2e03d32f50e3037a860cf5edbeb1aaddb915c
Status: Downloaded newer image for daocloud.io/nginx:latest
a8d6b8c489fd2d6b2e9be03f049e319df6f0859cc1e1283050ec864c7315b2e4
// 浏览器访问 http://localhost:8080 即可看到运行的nginx
// 替换nginx的访问页面
GoogoldeMacBook-Pro:Desktop googol$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a8d6b8c489fd daocloud.io/nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes 0.0.0.0:8080->80/tcp trusting_black
GoogoldeMacBook-Pro:Desktop googol$ docker cp test.html a8d6b8c489fd://usr/share/nginx/html
// 停止docker的nginx服务
GoogoldeMacBook-Pro:Desktop googol$ docker stop a8d6b8c489fd
a8d6b8c489fd
注意:Docker在容器内所做的改动都是暂时的是没有被保存的操作,需要在改动之后输入 ↓↓↓
// 保存docker的改动
GoogoldeMacBook-Pro:/ googol$ docker commit -m '提交的信息' image的id 标签名称
会产生一个新的image
// 删除docker的image
GoogoldeMacBook-Pro:/ googol$ docker rmi image的id
(remove image)
命令小结
docker pull 获取image
docker build 创建image
docker images 列出image
docker run 运行container
docker ps 列出container
dockerfile介绍
FROM 地址(alpine是针对docker做的一个极小的linux环境)、MAINTAINER维护者、CMD
// 创建 dockerfile
GoogoldeMacBook-Pro:Desktop googol$ mkdir d1
// 进入 d1 文件夹
GoogoldeMacBook-Pro:Desktop googol$ cd d1/
// 编辑文件 Dockerfile
GoogoldeMacBook-Pro:d1 googol$ vim Dockerfile
FROM alpine:latest
MAINTAINER jartins
CMD echo "hello docker"
// 创建images -t 为标签, . 为当前目录下的所有文件
GoogoldeMacBook-Pro:d1 googol$ docker build -t hello_docker .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM alpine:latest
latest: Pulling from library/alpine
188c0c94c7c5: Downloading
latest: Pulling from library/alpine
188c0c94c7c5: Pull complete
Digest: sha256:c0e9560cda118f9ec63ddefb4a173a2b2a0347082d7dff7dc14272e7841a5b5a
Status: Downloaded newer image for alpine:latest
---> d6e46aa2470d
Step 2/3 : MAINTAINER jartins
---> Running in d4184ea4f9c1
Removing intermediate container d4184ea4f9c1
---> feb63ea345e9
Step 3/3 : CMD echo "hello docker"
---> Running in 72985be2da4d
Removing intermediate container 72985be2da4d
---> 8be1c4ff0d13
Successfully built 8be1c4ff0d13
Successfully tagged hello_docker:latest
// 查看创建的images docker images images的标签
GoogoldeMacBook-Pro:d1 googol$ docker images hello_docker
REPOSITORY TAG IMAGE ID CREATED SIZE
hello_docker latest 8be1c4ff0d13 2 minutes ago 5.57MB
// 运行创建的images
GoogoldeMacBook-Pro:d1 googol$ docker run hello_docker
hello docker
dockerfile实战
// 创建 Dockerfile2 文件夹
GoogoldeMacBook-Pro:Desktop googol$ mkdir Dockerfile2
// 进入文件
GoogoldeMacBook-Pro:Desktop googol$ cd Dockerfile2
// 编辑 Dockerfile
GoogoldeMacBook-Pro:d2 googol$ vi Dockerfile
FROM ubuntu
MAINTAINER jartin
RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 81
/**
* FROM images源
* MAINTAINER 维护者
* RUN 执行命令
* COPY 复制 (在这里是将默认的页面改为index.html的内容)
* ENTRYPOINT 作为容器运行的命令存在的
* EXPOSE 端口
*/
// 当前目录级创建 index.html 并写入内容
This is HTML
// 运行Dockerfile
GoogoldeMacBook-Pro:d2 googol$ docker build -t jartins/hello-nginx .
Sending build context to Docker daemon 3.072kB
Step 1/8 : FROM ubuntu
---> f643c72bc252
Step 2/8 : MAINTAINER jartin
---> Using cache
---> 52411b06d15c
Step 3/8 : RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
---> Using cache
---> 759124ddb603
Step 4/8 : RUN apt-get update
---> Using cache
---> b030eb7cc47b
Step 5/8 : RUN apt-get install -y nginx
---> Using cache
---> 49b3e4fec072
Step 6/8 : COPY index.html /var/www/html
---> Using cache
---> 7f1a525db3c1
Step 7/8 : ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
---> Using cache
---> 4c3c17d90637
Step 8/8 : EXPOSE 81
---> Using cache
---> fc5e3ff65a08
Successfully built fc5e3ff65a08
Successfully tagged jartins/hello-nginx:latest
// 运行容器
GoogoldeMacBook-Pro:d2 googol$ docker run -d -p 8080:80 jartins/hello-nginx
42b6dae306eac055dc52ec83da3c587727d4969870e5e69fb3ae9c01cecaccd5
// 访问结果
GoogoldeMacBook-Pro:d2 googol$ curl http://localhost:8080
This is HTML
备注:from 指定基础镜像、run执行命令、add添加文件、copy拷贝文件、cmd执行命令、expose暴露端口。 add 会比 copy更加强大一点,copy可以拷贝文件或目录,add可将远程的文件加入到容器内。
备注:entrypoint和cmd相似 都是设定容器入口,但是两者又不一样,就是在没有指定entrypoint的情况下,就用cmd来启动,如果有Entrypoint cmd所指令的字符传就变成了entrypoint后面的一些argement(论据参数)。
user执行该命令的用户,通常我们不会用root在容器里面去执行
volume是指容器内所挂载的卷
镜像分层
volume介绍
容器中所作的操作是不会被保存的,而volume可以使数据在容器中共享。
volume操作
执行一个nginx 挂载一个卷 (第一种形式的数据渲染:通过直接修改挂载资源结果达到修改的目的)
// 执行一个nginx挂载一个卷
GoogoldeMacBook-Pro:d2 googol$ docker run -d --name nginx -v /usr/share/nginx/html nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
852e50cd189d: Pull complete
571d7e852307: Pull complete
addb10abd9cb: Pull complete
d20aa7ccdb77: Pull complete
8b03f1e11359: Pull complete
Digest: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
Status: Downloaded newer image for nginx:latest
beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615
// 检查镜像nginx的信息
GoogoldeMacBook-Pro:d2 googol$ docker inspect nginx
[
{
"Id": "beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615",
"Created": "2020-12-09T09:37:58.1506512Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 4454,
"ExitCode": 0,
"Error": "",
"StartedAt": "2020-12-09T09:37:59.4087403Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:bc9a0695f5712dcaaa09a5adc415a3936ccba13fc2587dfd76b1b8aeea3f221c",
"ResolvConfPath": "/var/lib/docker/containers/beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615/hostname",
"HostsPath": "/var/lib/docker/containers/beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615/hosts",
"LogPath": "/var/lib/docker/containers/beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615/beb68914b8d5a6498ca9fc606c632ba77fb46d07d2c16cdf8ed90a203a4dd615-json.log",
"Name": "/nginx",
"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": [
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/c757f3fee8f5970c34d9d05538bfd149d13a46aca5dba1eea856160faf74cfe9-init/diff:/var/lib/docker/overlay2/50aba5679e3ed4a8f3f2dc2fb9c87301955d40d1fbe937d1779d8ffc5bef44c5/diff:/var/lib/docker/overlay2/705ebe3c82981b33619a9399bb947d7015fb37841fa05588d80203617349fcce/diff:/var/lib/docker/overlay2/9ae3e04c9c5a6c7f49b5d17d069f2d663cace7085723d5b3087f04abaa5676b9/diff:/var/lib/docker/overlay2/69dc7cd392944a84b06c70c8a57a0df1920483522bee5136718a1ae8399d0121/diff:/var/lib/docker/overlay2/4d293c111d910084d29cccb5f9ab26cdfd7096a11fdd44a384f4c1bc7446ba7d/diff",
"MergedDir": "/var/lib/docker/overlay2/c757f3fee8f5970c34d9d05538bfd149d13a46aca5dba1eea856160faf74cfe9/merged",
"UpperDir": "/var/lib/docker/overlay2/c757f3fee8f5970c34d9d05538bfd149d13a46aca5dba1eea856160faf74cfe9/diff",
"WorkDir": "/var/lib/docker/overlay2/c757f3fee8f5970c34d9d05538bfd149d13a46aca5dba1eea856160faf74cfe9/work"
},
"Name": "overlay2"
},
"Mounts": [ 《============================================== 需要注意此处(挂载信息)
{
"Type": "volume",
"Name": "6ad32dc1d24f7a6bf7b43bf4745d838d39bca8f7e121a327c7b94566142262a6",
"Source": "/var/lib/docker/volumes/6ad32dc1d24f7a6bf7b43bf4745d838d39bca8f7e121a327c7b94566142262a6/_data",// 宿主机中的容器路径挂载到了Destination 修改Source即可
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
"Config": {
"Hostname": "beb68914b8d5",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.19.5",
"NJS_VERSION=0.4.4",
"PKG_RELEASE=1~buster"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "nginx",
"Volumes": {
"/usr/share/nginx/html": {}
},
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers \u003cdocker-maint@nginx.com\u003e"
},
"StopSignal": "SIGQUIT"
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "1670c2b9bba0ce99785b6d1e28bf6435c83a02b9cb1396156cc5572ee0137a3d",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": null
},
"SandboxKey": "/var/run/docker/netns/1670c2b9bba0",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "93103d9a086f7e31d6be8640b542906e22ef9d1d84ef5e7e6104ab7d7b38e972",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:03",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "76506799dce418fb85b1874b788c9be03ca081fc4928fbec640a722dbdcc1478",
"EndpointID": "93103d9a086f7e31d6be8640b542906e22ef9d1d84ef5e7e6104ab7d7b38e972",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:03",
"DriverOpts": null
}
}
}
}
]
执行一个nginx 挂载一个卷 (第二种形式的数据渲染: 本地的目录挂载到容器的数据渲染)