这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
1:了解Docker概念
docker解决问题
- 环境不一致
- 别人导致的系统卡顿,以前自己的程序因为别人的程序占用过多挂掉,docker隔离性,通过配置的信息,使得别人的应用不能够占用过多资源
- 双11,服务器,可以轻松复制服务器,在高并发的场景下能够快速解决服务器不足的场景
2走进docker
docker远程有一个仓库,仓库里面有镜像。构建自己的本地仓库,然后获取源程镜像,就能快速构建一个本地的环境。
build:构建,就是创建一个镜像,
ship:运输,运输镜像,从仓库和主机运输
run:运行的镜像就是一个容器
build,ship,run和镜像,仓库,容器一一对应
2.1镜像
- 镜像的名称组成为2个部分:[repository]:[tag]在没有指定tag时,默认是latest
镜像只能读,就像虚拟机上停止的虚拟系统。
相关命令:
- docker build:本地获取镜像,通过dockerfile构建一个镜像
- docker push:上传镜像,可供本人拉去
- docker pull:从服务器获取sudo docker pull nginx
- docker images:查看镜像sudo docker images
- docker rmi:删除镜像:sudo docker rmi nginx:latest
- docker save:镜像打包,发送出去sudo docker save -o nginx.tar nginx:latest
- docker load:打包的镜像解压。sudo docker load -i nginx.tar
获取:docker pull
查看:docker image ls / docker images
搜索镜像信息:docker search
创建镜像:
两种方式:
方式1:基于镜像创建,
docker container commit xxx 提交
docker container commit -m "Added test.txt file" -a "Allen" a0a0c8cfec3a test:0.1
-m :附加信息
-a :作者信息
a0a0xxx/ 原始镜像信息
test:0.1 : 名称和版本号
方式2:Dockerfile创建。
创建一个Dockerfile文件,描述一个如何基于一个父镜像,来创建一个新的镜像。
- 下载镜像源码:
- 创建文本文件 Dockerfile,进行编写
- 创建image文件
docker image build -t xxx
或者
docker iamge build -t xxx:x.x.1
-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest
上传镜像:
# Docker Hub 账号,获取Docker ID和密码
# 创建docker 仓库
$ docker login
# 命令行登录
$ docker tag python:3 repository_demo/python:3
# 打一个新的标签,前缀与新创建的 Docker ID 、仓库名保持一致
$ docker push repository_demo/python:3
# 推送镜像到远端仓库
2.2容器
几乎和镜像一摸一样,但是可以写,就像是运行的虚拟机容器有三种状态:运行、暂停、停止
容器命令:
docker run:创建并运行一个容器,处于运行状态 docker run --name containerName -p 80:80 -d nginx
docker pause:让一个运行的容器暂停
docker unpause:让一个容器从暂停状态恢复运行
docker stop:停止一个运行的容器
docker start:让一个停止的容器再次运行
docker rm:删除一个容器
docker exec:进入容器执行命令
docker logs:查看容器的运行日志
docker ps:查看所有的容器和运行状态
docker run运行容器:
docker run --name containerName -p 8080:80 -d nginx
--name:指定名称
-p端口映射,物理机8080端口和容器80端口映射
-d后台容器:nginx容器
docker exec进入容器:
docker exec -it mn bash
- docker exec :进入容器内部,执行一个命令
- -it : 给当前进入的容器创建一个标准输入、输出终端,允许我们与容器交互
- mn :要进入的容器的名称
- bash:进入容器后执行的命令,bash是一个linux终端交互命令
docker cp
将容器中的文件copy到本地
docker Commit
根据容器更改新的镜像
docker container commit -m "Added test.txt file" -a "Allen" a0a0c8cfec3a test:0.1
2.3仓库
镜像存放的场所,就像是虚拟机一样。
有远程的仓库,有本地仓库。
数据卷:
容器中有一些文件,在容器外我们不知道,我们每次操作都需要进入容器,时间长了,我们肯定会忘记容器中文件含义,于是数据卷提出。
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。一旦完成数据卷挂载,对容器的一切操作都会作用在数据卷对应的宿主机目录了。
这样,我们操作宿主机的/var/lib/docker/volumes/html目录,就等于操作容器内的/usr/share/nginx/html目录了。
所以上面提到的3个问题就都解决了!!!
修改宿主机文件系统,就相当于修改了容器。
支持多个容器的数据共享,将两个容器挂载同一个数据卷
不小心删除了容器,但是并不会删除数据卷,只要重新创建一个容器,再挂载到之前的数据卷数据就可以恢复!(共享之前的旧数据卷)
命令:
docker volume [COMMAND]
- create 创建一个volume
- inspect 显示一个或多个volume的信息
- ls 列出所有的volume
- prune 删除未使用的volume
- rm 删除一个或多个指定的volume
数据卷操作
创建数据卷html:docker volume create html
查看数据卷:docker volume ls
查看详细信息:docker volume inspect html
数据卷挂载到指定容器
docker run --name nginxname -v html:/usr/share/nginx/html -p 80:80 -d nginx
这样我们可以进入volume进行编辑了。
如图:共享位置在/var/lib/docker/volumes/html/_data/
3docker安装
自行百度:
4docker初体验
4.1基本命令
4.1.1docker pull [options] NAME[:TAG]
拉取远程仓库的镜像到本地
4.1.2docker images [options] [REPOSTORY][:TAG]
查看本地镜像
4.1.3 docker run [options] IMAGE[:TAG] [COMMAND] [ARG..]
运行某个镜像
4.2docker运行镜像流程
4.2.1Hello world
docker run ubuntu /bin/echo "hello world"
本地有一个docker daemon进程,处理我们的请求,
docker pull 向docker daemon发送一条命令,告诉它需要拉取一个镜像,daemon会先判断本地是否有该镜像,有就返回,没有就去远程仓库拉取。
docker run 命令发送给daemon,检查本地是否存在,不存在就docker pull。然后运行得到一个docker container。
/bin/echo "hello world":在容器中执行的命令
4.2.2交互性容器
docker run -i -t ubuntu /bin/bash
-t:在容器中指定一个伪终端
-i:允许容器就行标准输入。
4.2.3启动容器(后台)
docker run -d ubuntu /bin/sh -c “hello”
4.2.4容器使用
docker pull unbuntu 拉取容器
docker run -it unbuntu 启动容器,并且进入容器
docker ps -a 查看所有容器
docker start id 启动一个停止的容器
docker run -itd 后台运行
docker stop id 停止一个容器
docker restart id 重启一个容器
进入容器:
docker attach
docker exec 推荐,退出容器终端,不会导致容器停止
导入导出容器:
docker export id > xxx.tar 导出,将容器id,快照到本地文件xxx.tar中。
cat docker/ubuntu.tar | docker import - test/ubuntu:v1 ,导入本地容器
docker import example.com/exampleimag… example/imagerepo 通过url或则目录导入。
docker rm -f id:删除容器。
docker container qrune 处理所有处于终止状态的容器。
4.3镜像使用
docker images 查看本机所有镜像。
docker pull xxx 获取新的镜像
docker search xxx 查找镜像
docker rmi xxx删除镜像
镜像更新
镜像构建
docker build与Dockerfile搭配使用。
4.4容器连接
通过端口来访问docker容器中的服务。可以通过-P 或 -p指定端口的映射
docker run -d -P training/webapp python app.py 随机进行绑定
docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 指定ip和端口
docker port adoring_stonebraker 5000 查看容器5000绑定在那里。
4.4.1多容器互联
docker连接系统允许多个容器连接在一起,共享连接信息。
docker会创建一个父子关系,父容器可以看到子容器的信息。
容器命名:
docker run -d -P --name runoob training/webapp python app.py 通过--name进行命名
创建网络:
docker network create -d bridge test-net
-d 表示docker网络,有bridge和overlay
查看网络信息:
docker network ls
连接容器:
docker run -itd --name test1 --network test-net ubuntu /bin/bash
docker run -itd --name test2 --network test-net ubuntu /bin/bash
测试两机是否连接:
docker exec -it test1 /bin/bash
ping test2
配置DNS
4.5仓库管理
登录:docker login
退出docker logout
拉取镜像:docker search ubuntu
docker pull ubuntu
推送镜像:docker tag xxx xxx2
docker push xxx2 成功推送了xxx2这个镜像
5 docker运行nginx
docker pull 源程拉取nginx
docker run -d 后台方式运行nginx
docker ps 查看container信息。
需要进入容器调节参数,查看日志等.进入一个伪终端,相当于一台新的电脑。
docker exec -it ID bash
然后就能够在这个虚拟的系统里面进行操作
退出,调用共exit就能退出这个伪系统
停止运行的容器。
docker stop [containerId ]
6docker网络
由于隔离性,linux使用命名空间来对资源进行隔离,
6.1默认模式
1,docker容器在默认情况下,一般会分配一个独立的network-namespace,也就是网络类型中的Bridge模式,通过端口映射可以在主机上访问到,容器中的端口可以和主机上的端口之间建立映射,通过访问主机的端口来访问容器里的端口。
6.2Host模式
除了默认模式还有Host模式,在启动容器的时候开启这个模式,这样容器不会生成network,namespace,而是和逐渐使用同一个。也就是现在容器的网卡信息都是和主机上的相同,不是虚拟出来的。
6.3None模式
这种模式下没有网络,不与外界通信
dockerfile编写
Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。
- dockerfile 用于指示 docker image build 命令自动构建Image的源代码
- 是纯文本文件
用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。