docker| 青训营笔记

115 阅读9分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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的源代码
  • 是纯文本文件

用户可以将自己应用打包成镜像,这样就可以让我们应用进行容器运行.还可以对官方镜像做扩展,以打包成我们生产应用的镜像。

dockerfile连接

docker链接