docker初体验
Posted 强强强子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker初体验相关的知识,希望对你有一定的参考价值。
docker学习笔记
- docker
- docker 各个名词说明
- docker的基本命令
- docker search 镜像名字
- docker pull 镜像名字:TAG
- docker images
- docker run -itd -p 宿主机端口:容器内端口 --name 自定义名词 镜像ID
- docker ps
- docker stop 容器id
- docker ps -a
- docker start 容器id docker restart 容器id
- docker logs -tf --tail n 容器id
- docker top 容器ID
- docker inspect 容器ID
- docker exec -it 容器id /bin/bash
- docker attach 容器id
- docker cp 容器id:容器内文件路径 宿主位置
- docker数据卷
- Dockerfile
- docker网络
docker
百度百科:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker 各个名词说明
- Containers 容器:每启动一个镜像,就得到一个容器
- Images 镜像:把一系列环境操作封装在一起,可以做到开箱即用。(比如:一个镜像可以把Java的运行环境全部设置好,jdk tomcat)
- Volumes 数据卷:容器产生的数据可以放到宿主机上,容器可以挂载数据卷
docker的基本命令
docker search 镜像名字
比如搜索nginx镜像,会返回一个搜索结果列表
PS C:\\Users\\10482> docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16575 [OK]
bitnami/nginx Bitnami nginx Docker Image 121 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 39
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 17 [OK]
rancher/nginx-ingress-controller 10
……………………
docker pull 镜像名字:TAG
TAG就是镜像的版本号,版本号可以通过dockerHub 进行搜索查看
如果不带后面的TAG,则会直接拉取最新的镜像
PS C:\\Users\\10482> docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
c229119241af: Already exists
2215908dc0a2: Pull complete
08c3cb2073f1: Pull complete
18f38162c0ce: Pull complete
10e2168f148a: Pull complete
c4ffe9532b5f: Pull complete
Digest: sha256:2275af0f20d71b293916f1958f8497f987b8d8fd8113df54635f2a5915002bf1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
docker images
查看已经下载过的镜像
PS C:\\Users\\10482> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 12766a6745ee 7 days ago 142MB
docker run -itd -p 宿主机端口:容器内端口 --name 自定义名词 镜像ID
启动镜像。
-it:指交互模式启动
-d:后台运行
-p:暴露端口
–name 为容器起一个名字
下面以启动nginx镜像为例
PS C:\\Users\\10482> docker run -itd -p 80:80 --name nginx-test 12766a6745ee
8c6455110cc871ee48959d2a61349b195cb4834bbbec6628cd258cb3223dd15f
docker ps
查看正在运行的容器
PS C:\\Users\\10482> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c6455110cc8 12766a6745ee "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp nginx-test
docker stop 容器id
停止正在运行的容器
PS C:\\Users\\10482> docker stop 8c6455110cc8
8c6455110cc8
docker ps -a
查看历史所有运行过的容器,无论是正在运行的还是已经停止的
PS C:\\Users\\10482> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c6455110cc8 12766a6745ee "/docker-entrypoint.…" 6 minutes ago Exited (0) 49 seconds ago nginx-test
docker start 容器id docker restart 容器id
start:启动一个已经停止状态的容器
restart:重启一个容器
PS C:\\Users\\10482> docker start 8c6455110cc8
8c6455110cc8
PS C:\\Users\\10482> docker restart 8c6455110cc8
8c6455110cc8
docker logs -tf --tail n 容器id
打印容器内部的日志
n:从最后n行开始,持续堵塞打印
PS C:\\Users\\10482> docker logs -tf --tail 5 8c6455110cc8
2022-04-06T03:22:07.975798269Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 27
2022-04-06T03:22:07.976000054Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 28
2022-04-06T03:22:07.976148733Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 29
2022-04-06T03:22:07.976349348Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 30
2022-04-06T03:22:07.976492025Z 2022/04/06 03:22:07 [notice] 1#1: start worker process 31
docker top 容器ID
查看容器内的进程情况
PS C:\\Users\\10482> docker top 8c6455110cc8
UID PID PPID C STIME TTY TIME CMD
root 1634 1615 0 03:22 ? 00:00:00 nginx: master process nginx -g daemon off;
uuidd 1684 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1685 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1686 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1687 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1688 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1689 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1690 1634 0 03:22 ? 00:00:00 nginx: worker process
uuidd 1691 1634 0 03:22 ? 00:00:00 nginx: worker process
docker inspect 容器ID
查看容器的元数据(配置信息)
PS C:\\Users\\10482> docker inspect 8c6455110cc8
[
"Id": "8c6455110cc871ee48959d2a61349b195cb4834bbbec6628cd258cb3223dd15f",
"Created": "2022-04-06T03:12:49.809186187Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State":
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 1634,
"ExitCode": 0,
"Error": "",
"StartedAt": "2022-04-06T03:22:07.965678437Z",
"FinishedAt": "2022-04-06T03:22:06.956404893Z"
,
"Image": "sha256:12766a6745eea133de9fdcd03ff720fa971fdaf21113d4bc72b417c123b15619",
…………………………此处省略……………………
docker exec -it 容器id /bin/bash
-it 交互模式打开
进入容器,并进入终端(打开一个新的终端)
PS C:\\Users\\10482> docker exec -it 8c6455110cc8 /bin/bash
root@8c6455110cc8:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@8c6455110cc8:/# date
Wed Apr 6 03:32:04 UTC 2022
root@8c6455110cc8:/#
docker attach 容器id
进入容器,并进入一个正在运行的终端
docker cp 容器id:容器内文件路径 宿主位置
把容器内的文件拷贝到宿主机器上
docker数据卷
当容器删除后,容器内的所有数据都会丢失(比如mysql数据库)。为了解决这一问题,docker引入了Volumes技术。把容器内的文件或者文件夹映射到宿主机器上,双向同步。
docker run -it -v 宿主机目录路径:容器内目录路径 nginx
因为docker只能挂载文件夹,我们先把上次运行的nginx-test主要配置文件拷贝出来 nginx.conf 和conf.d 文件夹
PS C:\\Users\\10482> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fb752de772a nginx "/docker-entrypoint.…" 22 minutes ago Up 22 minutes 0.0.0.0:80->80/tcp nginx-test
PS C:\\Users\\10482> docker cp 9fb752de772:/etc/nginx/nginx.conf D:\\dockerData\\nginx\\
PS C:\\Users\\10482> docker cp 9fb752de772:/etc/nginx/conf.d D:\\dockerData\\nginx\\
然后重新启动一个镜像,生成一个新的容器。并对相关文件进行挂载。
PS C:\\Users\\10482> docker run -itd --name nginx-volume1 -p 80:80 -v D:\\dockerData\\nginx\\nginx.conf:/etc/nginx/nginx.conf -v D:\\dockerData\\nginx\\wwwroot:/wwwroot -v D:\\dockerData\\nginx\\conf.d:/etc/nginx/conf.d nginx
b49ed3848116c298d13640f18777ae94409de9da3509c689617cc6d0203f350d
执行后我们可以分析一下挂载是否成功,以及挂载的配置
PS C:\\Users\\10482> docker inspect b49ed3848116
[
……………………此处省略……………………
"Mounts": [
"Type": "bind",
"Source": "D:\\\\dockerData\\\\nginx\\\\nginx.conf",
"Destination": "/etc/nginx/nginx.conf",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
,
"Type": "bind",
"Source": "D:\\\\dockerData\\\\nginx\\\\wwwroot",
"Destination": "/wwwroot",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
,
"Type": "bind",
"Source": "D:\\\\dockerData\\\\nginx\\\\conf.d",
"Destination": "/etc/nginx/conf.d",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
……………………此处省略……………………
]
上面的Mounts部分的信息,就显示了我们之前挂载的配置。
挂载的文件和宿主机双向同步
在宿主机创建一个index.html文件,容器内也存在。
#此时容器内还没有index.html文件
PS C:\\Users\\10482> docker exec -it b49ed3848116 /bin/bash
root@b49ed3848116:/# cd /wwwroot/
root@b49ed3848116:/wwwroot# ls
root@b49ed3848116:/wwwroot#
#在宿主机wwwroot中创建一个index.html 文件
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx
$ cd wwwroot/
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ ls
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ vim index.html
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ cat index.html
hello docker
#
#此时会发现,容器内index.html 也存在了
root@b49ed3848116:/wwwroot# ls
index.html
root@b49ed3848116:/wwwroot# cat index.html
hello docker
#
#容器内删除index.html 并且创建一个main.html
root@b49ed3848116:/wwwroot# touch main.html
root@b49ed3848116:/wwwroot# rm index.html
root@b49ed3848116:/wwwroot# ls
main.html
#
#查看宿主机,发现和容器内的数据一致
10482@DESKTOP-Q0BVVQG MINGW64 /d/dockerData/nginx/wwwroot
$ ls
main.html
这样就可以把数据以及配置放在宿主机上,方便灵活配置。
容器删除,挂载的文件不会删除
具名挂载&匿名挂载
-v 宿主机目录路径:容器内目录路径
如果宿主机目录路径不指定会怎么样?
-v 容器内目录路径
这样就是匿名挂载,挂载的宿主机目录就在/var/lib/docker/volumes/xxxxx,xxx就是docker随机生成的id。
如果宿主机目录路径 填写的不是一个绝对路径。那么这个路径就成为了挂载卷的名字。
eg:-v wwwroot:/data/wwwroot
那么这个挂载卷的名称就是wwwroot 这就是具名挂载,挂载的宿主机目录就是/var/lib/docker/volumes/wwwroot
通过命令 docker volume ls 可以列出所有的具名挂载和匿名挂载
#列出所有数据卷
PS C:\\Users\\10482> docker volume ls
DRIVER VOLUME NAME
local 983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799
local c25b2344a06b0ac0970baa19132be8375074f474daecf6b00b2c49030ff991d7
#查看数据卷的配置
PS C:\\Users\\10482> docker volume inspect 983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799
[
"CreatedAt": "2022-04-04T09:12:56Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799/_data",
"Name": "983a795226ff6e1238d73f70e52276ac2124b93c265a3b51bffa239cfe76c799",
"Options": null,
"Scope": "local"
]
Dockerfile
Dockerfile 是一个用来构造镜像的脚本文件,通过它可以构造我们自己想要的镜像。
Docker常用的命令
FROM #基础镜像
MAINTAINER #镜像作者 姓名<email>
RUN #镜像构建时需要运行的命令
ADD #添加其他文件 会自动解压 比如jdk压缩包 tomcat压缩包
WORKDIR #镜像的工作目录 进入容器后的默认目录
VOLUME #挂载数据卷
EXPOSE #指定对外的端口
CMD #指定容器启动时执行的命令 只有最后一个会生效 可以被覆盖
ENIRYOINT #指定容器启动时执行的命令,可以追加命令
ONBUILD #当构建一个被继承的 Dockerfile 这个时候就会运行 ONBUILD 触发命令
COPY #类似ADD 将文件拷贝到镜像
ENV #构建时设置环境变量
Dockerfile文件示例
#以centos镜像作为基础
FROM centos
#制作镜像的作者信息
MAINTAINER zzq<1048222543@qq.com>
#设置一个环境变量
ENV myPath /usr/local
#设置工作目录,进入镜像终端后自动在工作目录下
WORKDIR $myPath
#解决centos8 停止维护 导致yum无法执行
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
#为镜像安装一些软件
RUN yum -y install vim
RUN yum -y install net-tools
#暴露端口
EXPOSE 80
CMD echo $myPath
CMD echo "---end---"
#进入镜像后 自动打开终端
CMD /bin/bash
docker build 构建一个镜像
docker build -f Dockerfile文件路径 -t 镜像名词:镜像版本号 .
#构建一个名词为zzq-centos:1.0的镜像
PS C:\\Users\\10482\\Desktop\\dockerfile> docker build -f .\\centosDockerfile -t zzq-centos:1.0 .
[+] Building 0.1s (11/11) FINISHED
=> [internal] load build definition from centosDockerfile 0.0s
=> => transferring dockerfile: 38B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [1/7] FROM docker.io/library/centos 0.0s
=> CACHED [2/7] WORKDIR /usr/local 0.0s
=> CACHED [3/7] RUN cd /etc/yum.repos.d/ 0.0s
=> CACHED [4/7] RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* 0.0s
=> CACHED [5/7] RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repo 0.0s
=> CACHED [6/7] RUN yum -y install vim 0.0s
=> CACHED [7/7] RUN yum -y install net-tools 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:1e0e69ce8d6387dadaba6c93f6208388e1521ca1cfbdc1b9a369fc95ee961b04 0.0s
=> => naming to docker.io/library/zzq-centos:1.0 0.0s
#发现存在一个名词为zzq-centos 版本号为1.0的镜像
PS C:\\Users\\10482\\Desktop\\dockerfile> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zzq-centos 1.0 1e0e69ce8d63 23 hours ago 312MB
#进入自己制作的镜像 发现进入了终端,且默认就在工作目录下
PS C:\\Users\\10482\\Desktop\\dockerfile> docker run -it zzq-centos:1.0
[root@c37cf34c935a local]# pwd
/usr/local
docker网络
如上图就是docker网络的实现,首先是存在一个docker0的虚拟网卡,然后各个容器以桥接模式访问。
docker network create
#创建一个网段192.16.0.0/16 的网络 可用ip是192.16.0.0~192.16.255.255 16代表ip的前面2位不可分配 网关是127.18.0.1 网络名称是test 网络模式是bridge(桥接)
PS C:\\Users\\10482> docker network create --driver bridge --subnet 192.16.0.0/16 --gateway 192.16.1 test
a42b08afe8c1e185d5faf861d6efcda35ef8afddfcab4e77d806a37e1dde1d2c
#查看所有网络
PS C:\\Users\\10482\\Desktop\\dockerfile> docker network ls
NETWORK ID NAME DRIVER SCOPE
a42b08afe8c1 test bridge local
#查看网络的具体信息
PS C:\\Users\\10482\\Desktop\\dockerfile> docker network inspect 19cdc15a9407
[
"Name": "test",
"Id": "a42b08afe8c1e185d5faf861d6efcda35ef8afddfcab4e77d806a37e1dde1d2c",
"Created": "2022-04-06T07:37:36.75540045Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM":
"Driver": "default",
"Options": ,
"Config": [
"Subnet": "192.16.0.0/16",
"Gateway": "192.16.0.1"
]
,
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom":
"Network": ""
,
"ConfigOnly": false,
"Containers": ,
"Options": ,
"Labels":
]
使用自定义的网络
#创建两个容器 在同一网络内
PS C:\\Users\\10482> docker run -itd -p 81:81 --name nginx1 --network test --ip 192.16.0.2 nginx
PS C:\\Users\\10482> docker run -itd -p 82:82 --name nginx2 --network test --ip 192.16.0.3 nginx
这样网络隔离后,更方便我们搭建各种集群以及集群的网络安全。
以上是关于docker初体验的主要内容,如果未能解决你的问题,请参考以下文章