- Docker介绍
- 镜像 image
- 容器container
- 基于Dockerfile创建镜像
- 为 Dockerfile 中的注释。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。- 编写Dockerfile
- FROM:指定基础镜像,必须为第一个命令
- MAINTAINER: 维护者信息
- RUN:构建镜像时执行的命令
- ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
- COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
- CMD:构建容器后调用,也就是在容器启动时才进行调用。
- ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。
- LABEL:用于为镜像添加元数据
- ENV:设置环境变量
- EXPOSE:指定于外界交互的端口
- VOLUME:用于指定持久化目录
- WORKDIR:工作目录,类似于cd命令,目录不存在会自动创建
- ARG:用于指定传递给构建运行时的变量
- ONBUILD:用于设置镜像触发器
- Dockerfile创建示例
- 编写Dockerfile
- This my first nginx Dockerfile
- Version 1.0
- Base images 基础镜像
- MAINTAINER 维护者信息
- ENV 设置环境变量
- ADD 文件放在当前目录下,拷过去会自动解压
- RUN 执行以下命令
- WORKDIR 相当于cd
- EXPOSE 映射端口
- CMD 运行以下命令
- volumes数据盘
- 网络
- compose编排
- Ubuntu系统安装docker
- 把docker-desktop-data移出系统盘
- docker配置镜像加速器
- 查看网络端口
Docker介绍
https://jiajially.gitbooks.io/dockerguide/content/dockerIND.html
镜像 image
Docker镜像是Linux的文件系统(Root FileSystem),该文件系统里面包含可以运行Linux内核的程序以及数据。
通过镜像可以创建容器,一个镜像就是一个可执行的包,其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件。
Docker把App文件打包成一个镜像,并且采用类似多次快照的存储技术可以实现以下内容:
- 多个App可以共用相同的底层镜像
- App运行时的IO操作和镜像文件隔离
- 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个APP镜像可以用来运行无数个不同业务的容器 | 命令 | 说明 | 语法 | 示例 | | —- | —- | —- | —- | | ls | 查看全部镜像 | docker images | | | search | 查找镜像 | docker search [imageName] | | | history | 查看镜像历史 | docker history [imageName] | | | inspect | 显示镜像详细信息 | docker inspect [imageName] | | | pull | 拉取镜像 | docker pull [imageName] | | | push | 推送一个镜像到镜像仓库 | docker push [imageName] | | | rmi | 删除镜像 | docker rmi [imageName] | docker rmi 7e0aa2d69a15 | | prune | 移除未在使用的镜像,没有任何标记或任何容器引用 | docker image prune | | | tag | 标记本地镜像,将其归入某个仓库 | docker tag [options] image:[tag] [REPOSITORY]/[username]/name:tag | docker tag centos:7 shenshuai/centos:v1 | | export | 将容器文件系统作为一个tar归档,到处到stdout | docker export [options] [containerId] | docker export -o latestubuntu.tar 80055d6c3440 | | import | 导入容器快照文件系统tar归档文件,并创建镜像 | docker import [option] file/url/[REPOSITORY:tag] | docker import latestubuntu.tar | | save | 将制定的镜像保存为tar文件 | docker save [options] image [image] | docker save -o latestubuntu.tar ubuntu:latest | | load | 加载tar文件并创建镜像 | docker save [options] image [image] | docker load -i latestubuntu.tar | | build | 基于Dockerfile构建镜像 | docker build [options] path /url | |
save和export区别:save通过镜像保存的文件,export通过容器生成的文件
load和import区别:都是把rar文件导入镜像,load不能指定名字和标签,因为save时已经携带有名字和标签信息
拉取镜像pull
docker pull centos
# 支持后返回
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
查看镜像列表images
docker images
export导出镜像
docker export -o latestubuntu.tar 80055d6c3440
import导入镜像
删除镜像 rmi
docker rmi 【镜像id/或镜像REPOSITORY】
删除未使用的镜像prune
// 清除没有被容器使用的镜像文件
docker image prune -af
// 清除多余的数据,包括停止的容器、多余的镜像、未被使用的volume
docker system prune -f
容器container
容器是通过镜像创建出来的实例。就像面向对象程序设计的类和对象关系,镜像是静态的类,容器是镜像的运行实体。
容器可以被创建、启动、停止、删除、暂停。
命令 | 说明 | 语法 | 示例 |
---|---|---|---|
run | 从镜像运行容器 | docker run [options] imageName [command] | docker run -it centos /bin/bash |
ls | 列出容器 | docker container ls | |
inspect | 显示容器的详细信息 | docker inspect [containerID] | |
exec | 进入正在运行的docker容器,执行命令 | docker exec -it [containerID] /bin/bash | docker exec -it d196755b8453 /bin/bash |
stats | 显示容器资源使用统计 | docker stats | |
top | 显示容器运行的进程 | docker top [containerID] | |
update | 更新容器配置 | ||
port | 列出指定容器端口映射 | docker container port【containerID】 | docker container port okewijx23或者 docker run -d -p 8080:80 nginx |
ps | 查看当前运行的容器, -a可以查看所有容器 -l 查看最新容器 |
docker ps | |
kill | 终止容器运行 | docker kill 【containerID】 | |
start | 启动停止运行的容器 | docker start 【containerID】 | |
stop | 终止容器运行 | docker stop 【containerID】 | |
rm | 删除容器 | docker rm 【containerID】 | 删除所有容器 docker container rm $(docker container ps -a -q) |
cp | 从正在运行的Docker容器里面,将文件拷贝到本机 | docker container cp 【containerID】:filePath . | docker container cp 5329e8afe31b:/usr/new.txt . |
commit | 根据容器创建新镜像 | docker commit -m”设置的message” -a”作者” 【容器ID】 【生产镜像的信息】:tag | -> docker commit -m”set node” -a”shenshuai” 89a4e724bd79 shenshuai/mysetnode:v5 |
logs | 查看docker容器的输出 | docker logs 【containerID】 |
创建容器create
> docker create --name ubuntuContainer ubuntu:18.04
0da83bc6515ea1df100c32cccaddc070199b72263663437b8fe424aadccf4778
启动容器 start
docker start ubuntuContainer
#或者
docker start 0da83bc6515ea
进入/退出容器 exec /exit
# 进入容器并启动命令
docker container exec -it 25518b008113 /bin/bash
# sh -c 可以运行shell命令
sh -c "echo hello"
#可以进行正在运行的busybox容器
docker exec -it 5329e8afe31b /bin/sh
创建容器时,参数含义
参数 | 说明 |
---|---|
-i —interactive | 交互式 |
-t -tty | 分配一个伪终端 |
-d —detach | 运行容器到后台 |
-a —attach list | 附加到运行容器 |
-e —env list | 设置环境变量 -> docker run -it -e username=”shenshuai” busybox /bin/sh -> . echo ${username} |
-p —publish list | 发布容器端口到主机 |
-P | —publish-all |
退出容器,直接使用exit
进入启动容器,必须确保容器是运行状态
查看容器 ps
docker ps
docker ps -a //可以查询出容器的id/name/command/status/ports/image等
# 启动容器
docker container start 25518b008113
# 停用容器
docker container stop 25518b008113
# kill容器
docker container kill 25518b008113
# 删除容器
docker rm 25518b008113
docker run创建并进入容器
docker run 命令参数解释
- -i :以交互模式运行容器,通常与 -t 同时使用命令解释
- -t :为容器重新分配一个伪输入终端,通常与 -i 同时使用
- -d :后台运行容器,并返回容器ID
- -p:80:80 将容器内80端口映射至宿主机80端口
- -v : /home/docker_data/nginx:/etc/nginx 将容器/etc/nginx目录挂载到宿主机/home/docker_data/nginx目录下,若宿主机内此目录不存在将会自动创建
- –restart always :容器自启动
- –privileged=true :让容器获取宿主机root权限
- –name gitlab :设置容器名称为gitlab
- ubuntu:18.04 :镜像的名称,这里也可以写镜像ID
/bin/bash:进入容器时的交换命令
docker run -it --name runUbuntuContainer ubuntu:18.04 /bin/bash
创建在后台执行容器,并端口映射
docker run -d --name mynginx -p 8123:80 nginx
docker执行之后,容器不能正常运行,可以通过docker log
,查看报错日志。 在容器中安装Node环境
进入容器后,一切操作和普通环境一样,可以通过nvm安装node环境
> apt-get update
> apt-get install wget
> wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
安装过程可能会出现
Connecting to raw.githubusercontent.com failed: Connection refused.
出现报错是由于连接的网络环境问题
解决方法:查询raw.githubusercontent.com的真实IP
在https://www.ipaddress.com/ 查询raw.githubuercontent.com的真实IP。修改hosts
在/etc/hosts/中绑定查到的host,例如:sudo vim /etc/hosts
#绑定host
185.199.108.133 raw.githubusercontent.com
185.199.109.133 raw.githubusercontent.com
185.199.110.133 raw.githubusercontent.com
185.199.111.133 raw.githubusercontent.com
安装完之后可能当前 session 读不到 nvm 命令,可以 exit 之后再进入中终端环境。如果在容器内,可以执行 source .bashrc 来更新环境配置。
nvm --version //打印出版本号,则安装成功
commit容器,创建新的镜像
安装好的环境,希望能够在其它地方使用来创建容器,可以把刚安装了node 环境的容器进行commit为镜像。
-> docker commit --author "shenshuai" --message "node env" 89a4e72 shenshuai/mynode:v1
-> 成功后返回sha256:80a3185ec8de35ea3963c0ad8271b1dd4defe87ef351ba9422598169fcc408c6
# -a作者信息 -m生成镜像的信息
-> docker commit -m"set node" -a"shenshuai" 89a4e724bd79 shenshuai/mysetnode:v5
-> sha256:8b631abcd27037fef7c06b1b3ed0e894f7ae92ddbbadff5f5c33e0d90a20bba1
通过docker images就可以看到新生成的镜像
接下来就可以使用新创建的镜像生成容器docker run -it --name newWorkSpace shenshuai/mynode:v1 /bin/bash
push定制的镜像到docker hub
登陆已经注册好的docker hub账号,https://hub.docker.com/
docker login
docker push shenshuai/mynode:v1
The push refers to repository [docker.io/shenshuai/mynode]
690e02c6ec26: Pushed
5f08512fd434: Pushed
c7bb31fc0e08: Pushed
50858308da3d: Pushed
v1: digest: sha256:31437ead322e5c348c377755e819bf960c57178bc0755c39ef57e712817f3750 size: 1156
这样就可以将本地配置的镜像上传hub仓库,方便在其它系统环境使用。
Dockerfile,可以快速生成定制化镜像
Dockerfile 的格式统统为:
# Comment INSTRUCTION arguments
必须以 FROM BASE_IMAGE 开头指定基础镜像。
更详细的规范与说明请参考 Dockerfile reference。这里我们以基于上面的
Dockerfile 如下FROM shenshuai/mynode:v1
mkdir code
基于shenshuai/mynode:v1创建新镜像,并且在新镜像中创建目录code。
docker build -t newnode:v1 .
注意:newnode文件命名必须全部小写。
然后查看全部镜像docker images
使用newnode镜像生成一个容器,查看code目录是否存在。docker run -it 7f13197fd518 /bin/bash
Dockerfile可以有更多过程的,详情参考官网
https://docs.docker.com/engine/reference/builder/删除容器 rm
docker container rm [容器id]
# 删除所有容器
docker container rm $(docker container ps -a -q)
基于Dockerfile创建镜像
Docker镜像是用一层一层的文件组成
- docker inspect 命令可以查看镜像或容器
- layers就是镜像的层文件,只能读,不能修改。基于镜像创建的容器会共享这些文件层。
Dockerfile 文件编写好以后,真正构建镜像时需要通过 docker build 命令。
docker build 命令用于使用 Dockerfile 创建镜像。
# 使用当前目录的 Dockerfile 创建镜像
docker build -t mycentos:7 .
# 通过 -f Dockerfile 文件的位置创建镜像
docker build -f /usr/local/dockerfile/Dockerfile -t mycentos:7 .
- -f:指定要使用的 Dockerfile 路径;
—tag, -t:镜像的名字及标签,可以在一次构建中为一个镜像设置多个标签。
Dockerfile的基本结构:
基础镜像信息
- 维护者信息
- 镜像操作指令
- 容器启动时执行指令
为 Dockerfile 中的注释。
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。
编写Dockerfile
命令 | 含义 | 示例 |
---|---|---|
FROM | 基础镜像 | FROM node |
COPY | 拷贝 | COPY ./app /app |
WORKDIR | 指定工作路径 | WORKDIR /app |
RUN | 编译打包镜像阶段运行命令 | RUN npm install |
EXPOSE | 容器暴露端口 | EXPOSE 3000 |
CMD | 容器运行时,运行命令 | CMD npm start |
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
- FROM 表示新镜像继承的镜像
- COPY 将当前目录下的app目录下的文件都拷贝到image里的/app目录中
- WORKDIR 指定工作路径,类型cd命令
- RUN npm install 在/app目录下安装依赖,安装后的依赖也会打包到镜像目录中,编译镜像时执行命令
- EXPOSE 暴露3000端口,允许外部连接这个端口
- CMD 启动容器时,执行的命令,只能有一个。如果在创建时传入了执行命令,会被覆盖
FROM:指定基础镜像,必须为第一个命令
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可选的,如果不使用这两个值时,会使用latest版本的基础镜像
MAINTAINER: 维护者信息
格式:
MAINTAINER <name>
示例:
MAINTAINER shenshuai89
MAINTAINER shenshuai89@qq.com
MAINTAINER shenshuai89 <shenshuai89@qq.com>
RUN:构建镜像时执行的命令
RUN用于在镜像容器中执行命令,其有以下两种命令执行方式:
shell执行
格式:
RUN <command>
exec执行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,
可以在构建时指定--no-cache参数,如:docker build --no-cache
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] 用于支持包含空格的路径
示例:
ADD hom* /mydir/ # 添加所有以"hom"开头的文件
ADD hom?.txt /mydir/ # ? 替代一个单字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
格式:
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同于RUN,CMD用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的命令。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去”application”,只使用参数。
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT与CMD非常类似,不同的是通过docker run执行的命令不会覆盖ENTRYPOINT,
而docker run命令中指定的任何参数,都会被当做参数再次传递给ENTRYPOINT。
Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行
最后的ENTRYPOINT指令。
LABEL:用于为镜像添加元数据
格式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
示例:
LABEL version="1.0" description="这是一个Web服务器" by="IT笔录"
注:
使用LABEL指定元数据时,一条LABEL指定可以指定一或多条元数据,指定多条元数据时不同元数据之间
通过空格分隔。推荐将所有的元数据通过一条LABEL指令指定,以免生成过多的中间镜像。
ENV:设置环境变量
格式:
ENV <key> <value> #<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... #可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示;另外,反斜线也可以用于续行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
EXPOSE:指定于外界交互的端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE并不会让容器的端口访问到主机。
要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,
或通过-P参数来发布EXPOSE导出的所有端口
VOLUME:用于指定持久化目录
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
注:
一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:
1 卷可以容器间共享和重用
2 容器并不一定要和其它容器共享卷
3 修改卷后会立即生效
4 对卷的修改不会对镜像产生影响
5 卷会一直存在,直到没有任何容器在使用它
WORKDIR:工作目录,类似于cd命令,目录不存在会自动创建
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
注:
通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令
都会在该目录下执行。在使用docker run运行容器时,可以通过-w参数覆盖构建时所设置的工作目录。
ARG:用于指定传递给构建运行时的变量
格式:
ARG <name>[=<default value>]
示例:
ARG site
ARG build_user=www
ONBUILD:用于设置镜像触发器
格式:
ONBUILD [INSTRUCTION]
示例:
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
注:
当所构建的镜像被用做其它镜像的基础镜像,该镜像中的触发器将会被触发
Dockerfile创建示例
```dockerfileThis my first nginx Dockerfile
Version 1.0
Base images 基础镜像
FROM centos
MAINTAINER 维护者信息
MAINTAINER xxxx
ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/
RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www
WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0
RUN ./configure —prefix=/usr/local/nginx —user=www —group=www —with-http_ssl_module —with-pcre && make && make install
RUN echo “daemon off;” >> /etc/nginx.conf
EXPOSE 映射端口
EXPOSE 80
CMD 运行以下命令
CMD [“nginx”]
![image.png](https://cdn.nlark.com/yuque/0/2021/png/737887/1637562244724-a9110038-8df0-4a8b-acb1-5312fde0d76f.png#clientId=u08d24fae-e70b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=294&id=u8c035bba&margin=%5Bobject%20Object%5D&name=image.png&originHeight=588&originWidth=1118&originalType=binary&ratio=1&rotation=0&showTitle=false&size=781359&status=done&style=none&taskId=u59a83972-cb36-4e00-add4-7e80275e348&title=&width=559)
<a name="ZFqi4"></a>
### .dockerignore镜像忽略文件
表示排除的文件,不要打包到image镜像中
```bash
.git
node_modules
示例Express-demo
1.安装node
通过nvm安装node环境
> apt-get update
> apt-get install wget
> wget -O- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
> source /root/.bashrc
> nvm install stable
2.安装express
> npm install express-generator -g
> express app
3.Dockerfile
FROM node
COPY ./app /app
WORKDIR /app
RUN npm install
EXPOSE 3000
CMD npm start
创建image
docker build -t express-demo .
- -t 用来指定image镜像的名称,后边可以加:tag指定标签,如果不知道默认就是latest
-
使用新镜像运行容器
-> docker container run -p 3123:3000 -it express-demo /bin/bash
-> npm start
-p 参数将容器的3000端口映射为本机的3123端口
- -it 将容器的shell映射为当前shell,在本机容器执行的命令都会发送到容器中执行
- express-demo image镜像名称
- /bin/bash 容器启动后执行的第一个命令
- —rm 在容器终止运行后,自动删除容器文件
volumes数据盘
使用docker容器,删除容器的时候,容器层里创建的文件也会被删除掉。如果想永久保存,比如web服务器日志,数据管理系统的数据,可以为容器创建数据盘。
数据盘用了将数据持久化到宿主机,与容器实现数据共享,简单的说就是将宿主机的目录映射到容器的目录,应用程序在容器中的目录读写数据会同步到宿主机上,让容器产生数据持久化。
- volumes Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
- 如果没有指定卷,则会自动创建
-
默认的volume挂载,默认文件存储位置
创建数据卷
docker volume create nginx-logger
docker volume ls
docker volume inspect nginx-logger
挂载数据卷
把nginx-html数据卷挂载到/usr/share/nginx/html,挂载后容器内的文件会同步到数据卷中
docker run -d --name=nginxvolume --mount src=nginx-html,dst=/usr/share/nginx/html nginx
docker run -d --name=nginxvolume -v nginx-html:/usr/share/nginx/html -p 3000:80 nginx
docker run -d --name=nginxvolume -v /Users/shuai/Desktop/code/volume-data:/usr/share/nginx/html -p 3000:80 nginx
删除数据卷
docker container stop nginx1
docker rm nginx1
docker volume rm nginx-html
Bind mounts模式,可以指定存放位置
此方式与Linux系统的mount方式相似,会覆盖容器内已存在目录或文件,但并不会改变容器内原有的文件,当mount后容器内原有的文件就会还原
- 创建容器可以通过-v或者 —volumn指定数据盘
- bind mounts可以存储在宿主机系统的任意位置
- 如果原文件或目录不存在,不会自动创建,会抛出错误
- 如果挂载目录在容器中非空目录,则该目录现有内容将被隐藏
指定数据盘
-v 参数进行挂载
docker run -v /Users/shuai/Desktop/code/volume-data:/mnt -it --name logs centos /bin/bash
cd mnt
echo 1 > 1.txt
exit
然后查看宿主机的/Users/shuai/Desktop/code/volume-data目录下,会多出一个1.txt文件,文件内容正是在容器中添加的内容。
docker inspect logs
# 输出信息
"Mounts": [
{
"Type": "bind",
"Source": "/Users/shuai/Desktop/code/volume-data",
"Destination": "/mnt",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
]
- Source:设置给容器使用的数据盘文件,在宿主机上的位置
- Destination:数据盘在容器上的位置
创建数据盘容器
该容器不启动,只作为数据盘共享
docker create [options] imageName [command] [arg…] 创建一个容器,但是不启动
—volumes-from设置数据盘的容器
docker create -v /mnt:/mnt --name logger centos
docker run --volumes-from logger --name logger3 -i -t centos /bin/bash
cd mnt
touch logger3
docker run --volumes-from logger --name logger4 -i -t centos /bin/bash
cd mnt
touch logger4
此时创建出来的logger3和logger4容器共享使用logger数据盘
网络
安装docker时,会创建三个网络,bridge(创建容器默认连接到此网络)、none、host。
- None:该模式关闭容器的网络功能,对外界完全隔离
- host:容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
- bridge:此模式每个容器分配IP
bridge桥接
- bridge网络代表所有docker安装中存在的网络
- 使用docker run —network=
选项指定,否则docker守护程序默认将容器连接到此网络 bridge模式使用 —net=bridge 指定。默认设置
docker network ls #列出当前的网络
docker inspect bridge # 查看当前的桥连网络
docker run -d --name nginx1 nginx
docker run -d --name nginx2 --link nginx1 nginx
docker exec -it nginx2 bash
apt update
apt install -y inetutils-ping #安装ping工具
apt install -y dnsutils
apt install -y net-tools
apt install -y iproute2
apt install -y curl
cat /etc/hosts
ping nginx1
在运行nginx2容器时,加上了—link参数,说明可以在nginx2容器中使用nginx1容器名称进行连接网络。
其中原因是,/etc/hosts文件添加了关于nginx1的IP映射关系
例如:nginxvolume nginxvolume1 nginxvolume2
nginxvolume1创建时,没有关联nginxvolume,在容器nginxvolume1中ping nginxvolume,访问不通
在创建nginxvolume2时使用了—link nginxvolume。docker run -d --name nginxvolume2 --link nginxvolume1 nginx
apt update
apt install -y inetutils-ping
ping nginxvolume1
cat /etc/hosts
none模式
none模式使用—net=none指定
# --net指定无网络
docker run -d --name nginx_none --net none nginx
docker inspect none
docker exec -it nginx_none bash
#该容器内部无法连接网络
host模式
host模式使用—net=host指定
docker run -d --name nginx-host --net host nginx
docker inspect host
端口映射
# 查看镜像里暴露出的端口号
docker image inspect nginx
# 让宿主机8080端口映射到docker容器的80端口
docker run -d --name port_nginx -p 8080:80 nginx
# 查看主机绑定的端口
docker container port port_nginx
指向主机的随机端口
```bash docker run -d —name random_nginx —publish 80 bash docker port random_nginx
docker run -d —name randomall_nginx —publish-all bash docker run -d —name randomallP_nginx -P bash
<a name="bCPxu"></a>
### 创建自定义网络
- 可以创建出多个网络,每个网络IP范围均不相同
- docker自定义网络里面有DNS服务,可以通过容器名称访问主机
```bash
# 创建自定义网络
docker network create --driver bridge mybridgeweb
# 查看自定义网络的主机
docker network inspect mybridgeweb
# 创建容器时指定网络
docker run -d --name myweb1 --net mybridgeweb nginx
docker run -d --name myweb2 --net mybridgeweb nginx
docker exec -it myweb2 bash
ping myweb1
通过自定义桥连网络mybridgeweb,可以把myweb1和myweb2都关联到mybridgeweb,那么myweb1和myweb2就可以建立网络连接
连接到指定网络,创建容器之间网络互联
docker run -d --name myconnectweb nginx
# 给mybridgeweb容器添加myconnectweb网络连接。然后可以在mybridgeweb连接到myconnectweb
docker network connect mybridgeweb myconnectweb
docker network disconnect mybridgeweb myconnectweb
connect 【源网络】 【被连接网络】 //可以在源网络容器中连接到被连接网络
移除网络容器
docker network rm mybridgeweb
compose编排
- compose通过一个配置文件管理多个Docker容器
- 在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本启动、停止、重启应用和应用中的服务以及所有依赖服务的容器
- 步骤
- 运行docker-compose up ,compose将启动并运行整个应用程序,配置文件组成
- services定义需要的服务,每个服务有自己的名字、使用的镜像、挂载的数据卷所属的网络和依赖的其它服务
- networks是应用的网络,在它下面可以定义使用的网络名称、类别
- volumes是数据卷,可以在此定义数据卷,挂载到不同的服务上
安装compose
yarn add docker-compose
编写docker-compose.yml
version: "2"
services:
nginx1:
image: nginx
ports:
- "8081:80"
nginx2:
image: nginx
ports:
- "8082:80"
docker-compose的命令
| 命令 | 服务 | | —- | —- | | docker-compose up | 启动所有服务 | | docker-compose up -d | 后台启动所有服务 | | docker-compose up —build | 更改了配置文件后,重新启动编译 | | docker-compose ps | 查看通过compose启动的容器
| | docker-compose start | 启动服务 | | docker-compose stop | 停止所有服务 | | docker-compose down | 删除所有容器和网络 | | docker-compose logs -f | follow跟踪日志变化 | | docker-compose exec nginx1 bash | 进入nginx1服务系统 | | docker-compose rm nginx1 | 删除服务容器 | | docker-compose network ls | 查看网络 |
网络互ping
docker-compose up -d
docker-compose exec nginx1 bash
apt update && apt install -y inetutils-ping
ping nginx2
配置数据卷
创建webserver目录
.
├── backend
│ └── index.html
├── data
├── docker-compose.yml
└── front
└── index.html
docker-compose.yml
version: "2"
services:
nginx1:
image: nginx
networks:
- "mynginxweb"
volumes:
- "data:/data"
- "./front:/usr/share/nginx/html"
ports:
- "8081:80"
nginx2:
image: nginx
networks:
- "default"
volumes:
- "data:/data"
- "./backend:/usr/share/nginx/html"
ports:
- "8082:80"
volumes:
data:
driver: local
networks:
mynginxweb:
driver: bridge
front和backend目录下分别创建index.html,会将该文件映射到nginx的文件夹下。
启动docker-compose up -d
可以访问http://localhost:8081和http://localhost:8082,分别显示index下的文件内容。
Ubuntu系统安装docker
官方安装地址
https://docs.docker.com/engine/install/ubuntu/
在原版的Ubuntu系统安装
第一:Update the apt package
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
第二:Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
第三: set up the stable repository
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第四:Install Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
此步骤如果提示:Package ‘docker-ce’ has no installation candidate ,并且已经执行过apt-get update。
那么需要配置docker仓库地址
#配置阿里云的gpg
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#配置阿里云的docker镜像
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"<br>
#执行安装命令
sudo apt-get install docker-ce docker-ce-cli containerd.io
windows系统的子系统wsl【Ubuntu】上安装docker,
第一:windows 设置打开开发者
第二步:开启使用子系统模式
第三步:确定使用wsl2版本
https://docs.microsoft.com/zh-cn/windows/wsl/install-win10
按照官方说明进行设置。设置完成在powershell中查看版本
第四部:安装子系统打开 Microsoft Store,
第五部安装 Docker Desktop for Windows
下载地址:https://www.docker.com/products/docker-desktop
安装成功后打开 Expose daemon on tcp://localhost:2375 without TLS
第六部:Ubuntu安装成功后打开运行,设置用户名和密码
第七步:依次执行上面原版系统的安装命令
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ export DOCKER_HOST=localhost:2375
$ echo "export DOCKER_HOST=localhost:2375" >> ~/.bashrc
查看docker version时报错
Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon running?
解决办法:执行sudo -i进入root权限下,同时一定要确保docker-desktop打开的 Expose daemon on tcp://localhost:2375 without TLS。
另外还要关联上启动的wsl系统。
之后可以在root权限下,查看docker version
把docker-desktop-data移出系统盘
windows 系统最新的docker 都是安装Docker Desktop for Window桌面版
多次docker pull镜像后,会使得docker-desktop-data数据非常大,放在C盘会把系统盘占满。可以docker-desktop-data迁移出来
docker-desktop-data 默认存放位置 C:\Users\shenshuai\AppData\Local\Docker\wsl\data
docker-desktop 默认存放位置 C:\Users\shenshuai\AppData\Local\Docker\wsl\distro【比较小,可不迁移】
首先导出wsl子系统镜像
wsl --export docker-desktop docker-desktop.tar //可选
wsl --export docker-desktop-data docker-desktop-data.tar
删除现有的wsl子系统
wsl --unregister docker-desktop //可选
wsl --unregister docker-desktop-data
重新创建wsl子系统
wsl --import docker-desktop D:\vmwork\docker\distro docker-desktop.tar
wsl --import docker-desktop-data D:\vmwork\docker\data docker-desktop-data.tar
如果提示:已存在具有提供的名称的分发,多执行几次删除命令。然后再重试创建
docker配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://5biptv7a.mirror.aliyuncs.com"]
}
EOF
# 重载所有修改过的配置文件
sudo systemctl daemon-reload
sudo systemctl restart docker
查看网络端口
使用docker本地安装nginx
docker container run -d -p 4030:80 --rm --name mynginx nginx
执行成功后,可以在本地输入localhost:4030查看