docker 使用简单教程
docker 学习与使用
docker介绍
Docker:容器,可以理解成一个“黑盒”。在项目变得庞大以后,往往我们会疲于管理整个项目的部署和维护。如果我们将整个项目用一个“容器”装起来,那么我们仅仅只用维护一个配置文件告诉计算机每次部署要把什么东西装进“容器”,甚至借用一些工具把这个过程自动化,部署就会变得很方便。
docker 结构
Docker 包含三个基本概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。镜像是 Docker 运行容器的前提,仓库是存放镜像的场所,可见镜像更是Docker的核心。
docker安装
- windows直接去官网下载应用程序
- linux可以直接用包管理工具下载安装包
docker的配置
先在项目下创建一个文件Dockerfile
。
编辑Dockerfile
文件:
Dockerfile
文件的详解link
我这里以一个flask项目为例。运行hello程序在./app/test.py
|
|
Dockerfile详解
|
|
关于CMD命令: 一定要使得该命令运行后保持前台,否则容器就会自动关闭。这是docker容器本质上是进程的概念
构建镜像与运行
构建:
|
|
结果
运行
|
|
访问
容器的管理
build指定运行中的环境变量
如果直接将一些参数写到Dockerfile是非常不安全的,所以一般是指定运行时环境变量。
docker build --build-arg
用于传递构建参数给Docker构建过程中的Dockerfile文件。这些构建参数可在Dockerfile内使用,通过${变量名}
格式访问。示例如下:
|
|
删除不需要的镜像,和容器
查看所有的容器
|
|
停止和删除容器
|
|
要先把镜像的容器都关了,才能删除相关镜像
查看当前有哪些镜像
|
|
删除镜像 删除images(镜像),通过image的id来指定删除谁
|
|
要删除全部image(镜像)的话
|
|
只删除未被使用的资源
- Docker 提供了方便的 docker system prune 命令来删除那些已停止的容器、dangling 镜像、未被容器引用的 network 和构建过程中的 cache:
在本地的镜像更新之后,就会出现类似图中红框内的
这些镜像被称为 intermediate 镜像(就是其它镜像依赖的层)。
我们还可在不同在子命令下执行 prune,这样删除的就是某类资源:
|
|
容器的网络模式
port映射
不解释,不是最优解,但是有时候挺有用
host模式
**Docker的host模式可以让容器直接使用宿主机的网络命名空间,即容器和宿主机使用相同的网络接口。**这种模式可以使得容器能够直接访问宿主机上的网络服务,并且不需要为容器暴露端口,因此可以获得更好的性能。由于容器和宿主机共享网络命名空间,所以它们具有相同的IP地址、端口和网络配置,因此与主机在同一个网络上。
如何主机有多个ip,docker容器也能够看到
关于docker的端口映射增改问题。
一般来说,在镜像运行成容器后就不能再更改端口映射了,并且下次启动原来的映射配置也在。
想要改变两个办法。 法一: 更改配置docker文件,具体上网查询 法二: 把现在的容器commit成镜像,然后再把镜像运行成容器,并且在运行的时候声明端口映射。
进入容器内部
好文的连接link
1,新建centos的镜像和容器。
|
|
2,对这个镜像创建容器(也就是说运行它)
docker container run -it -p 8888:8080 -v /opt/app:/opt/app --name=python-server 470671670cac bash
命令文档查看:docker container run –help
-it : 交互式终端(interactive terminal) ,也就是创建容器后进入容器。
-p 8888:8080 : 端口映射(port),将容器端口映射到宿主机端口(8888:宿主机端口,8080:容器端口),宿主机端口 8888 确认能被外网访问。
-v /opt/app:/opt/app:数据卷(volumn),将宿主机的数据(应用程序代码,配置文件等等)挂载到容器指定路径下,实现数据存储的持久化(如果没有数据挂载的话,容器销毁,容器中的数据会自动消失)。
–name=python-server: 新的容器的名称
470671670cac:镜像ID(imageID),当然也可以是 imageName + tag(docker.io/centos:latest)
bash:跟 -it 命令结合在一起操作,使容器创建后处于前端,一般是 /bin/bash,我这是bash。
结果:
查看所有容器
不中断退出容器
可以通过 Ctrl+p,Ctrl+q 退出容器,但容器还是处于运行状态(Up)。
或者输入命令exit
可以直接退出,但是容器也关闭了
查看容器的信息(例如ip等)
docker inspect container_id
然后有结果
进入容器
方法一
docker container exec -it 5de4e81a2e20(containerID或者容器的名字) bash(这个bash可以换成其他命令)
执行命令的方式:
- 先启动容器
- 然后使用exec命令去执行命令
其他容器命令
|
|
容器内的使用
我这里用的centos最新版也就是centos8.
执行yum有个bug:Failed to download metadata for repo 'appstream......
办法是进入容器执行
|
|
然后就可以使用yum安装各种库和程序了
改变系统的密码
|
|
安装ssh并启动
|
|
启动前修改 修改/etc/ssh/sshd_config这个ssh配置文件
退出后访问
将容器打包成镜像
在运行容器时指定映射端口运行后,如果想要添加新的端口映射,可以使用以下两种方式:
方式一:将现有的容器打包成镜像,然后在使用新的镜像运行容器时重新指定要映射的端口
大概过程如下:
先停止现有容器
docker stop container-name
将容器commit成为一个镜像
docker commit container-name new-image-name
用新镜像运行容器
结果
然后运行新的镜像
docker run -it -d --name container-name(or id) -p p1:p1 -p p2:p2 new-image-name
两个 -p 指定多个端口映射
**宿主机ssh连接入容器 **
我这里将外部的2020端口映射到容器里面的22端口。
用特定的连接工具MobaXterm
然后输入用户名和密码:成功
docker Hub的使用
先在hub中建立一个名叫centos_demo的仓库,我的用户名是${username}
在本地登录docker
|
|
准备在本地提交,先给images打标签
|
|
然后提交镜像push
|
|