Title

三.镜像。容器相关操作以及Docker应用部署和迁移备份

docker命令和dockerfile参考文档

https://cloud.tencent.com/developer/article/1698107

https://zhuanlan.zhihu.com/p/419175543#:~:text=Dockerfile

容器运行中添加端口映射

https://blog.csdn.net/wkh___/article/details/114879500#:~:text=

一.镜像相关

# 镜像当成是一个没有启动的操作系统
# redis镜像,mysql镜像,nginx镜像,django镜像,python镜像,指的是:linux+xx软件----》镜像跑起来就是--》容器:操作系统上运行着redis服务

# 查找镜像:
  # 命令行:
docker search helloworld
docker search centos
  #官方搜索:https://hub.docker.com/
  # 如下图

# 获取镜像:

docker pull centos     # 拉取最新的:相当于docker pull centos:latest  
docker pull centos:centos7  # 拉取一个centos7
docker pull centos:centos6.7
docker pull centos:centos10 # 这个 没有,就报错
 
# 查看本地镜像
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              470671670cac        3 months ago        237MB
centos              centos7             5e35e350aded        5 months ago        203MB

# 删除本地镜像
docker rmi 470671670cac  # 通过id号删除
docker rmi centos:centos7 # 通过名字删除
 
 
# docker rmi `docker images -q`
docker images -q相当于获取所有的id号
docker rim  470671670cac 5e35e350aded

命令行查找镜像

 

 官方搜索

 

 详细信息

 

 

 

二.Docker容器操作

docker ps   # 查看正在运行的容器#########
docker ps –a  # 查看所有容器(暂停的,停止,正在运行的。。。)##########

docker ps –l # 查看最后一次运行的容器
docker ps -f status=exited  # 查看停止的容器

# 重点:通过镜像创建并运行容器(两步并做一步)
创建容器命令:docker run
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。容器名字不能重
-v:表示目录映射关系(前者是宿主机目录,后者是容器的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,只是操作宿主机,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

# -v:数据卷,做目录映射
# -p 网络,做端口映射
#举例:在宿主机内部跑django的容器如何链接跑mysql的容器
#1.容器也是有ip地址的,django可以直接链接
#2.将mysql的端口映射到宿主机中,比如还是映射3306,django通过访问宿主机来访问,但是注意修改端口号,否则宿主机和容器只能起一个,同一个端口只能被一个软件监听

# 演示
#基于哪个镜像跑容器:centos:centos7   如果写成centos表示跑最新的
#如果没有这个镜像呢?去远程拉,拉下来再跑
# 容器要运行,需要有一个前台进程,可以通过守护进程的方式运行容器(解释:下面这个容器的运行,是有一个bash终端挂在这,表示容器有一个进程在存活,bash关闭,容器也就关闭了,因此容器要运行,需要有一个前台进程)
docker run -it --name=mycentos7 centos:centos7 /bin/bash

# it表示运行并进入容器,-i -t缩写
#--name:起一个名字
#centos:centos7:表示基于centos的centos7版本,若不加centos7表示基于最新版
# bin/bash:表示bin路径下的base文件,他是一个软件,是进入启动容器的bash终端,可以有多个终端,用来执行命令的,可以通过执行exit逐层退出bash,最后一层bash退出就会退出docker

'''
[root@localhost ~]# docker run -it --name=mycentos7 centos:centos7 /bin/bash
[root@29b72b8c9766 /]# docker -v   // 这就进入容器了,这是一个纯净的centos7的容器
bash: docker: command not found
[root@29b72b8c9766 /]# exit // 退出
exit

'''


# 以守护进程形式跑(会有一个/bin/bash前台进程命令在执行,只是并没有进入到容器内部)
docker run -di  --name=mycentos2_2 centos:centos7
 
# 进入到容器内部操作容器
1 exec(用的最多):在docker中执行命令
docker exec -it mycentos2_2 /bin/bash
exit 退出(此时退出还有一个前台进程在存活)

docker exec mycentos2_2 ls  (表示进入并执行ls命令)

2 attach (当没有)
3 ssh连接(容器要启动ssh服务22端口没有服务在监听)


# 容器的启动与停止
docker stop 容器id/名字
docker start 容器id/名字
docker restart 容器id/名字

# 文件拷贝
# 从宿主机copy到容器内部
docker cp 要拷贝的文件或者目录 容器名称:容器目录
docker cp untitled3.tar mycentos2_2:/home
# 从容器内部copy出来 (./表示当前目录下)
docker cp mycentos2_2:/home/untitled3.tar ./

 
# 数据卷(目录映射)
# 1.比如容器的软件是mysql,有一个root/data目录,里面放着数据信息,同步映射到宿主机的一个home/data目录,这样不论在容器中还是宿主机中增删改查data的信息都会影响到另一个,但是如过整个容器突然没了,宿主机还在,可以重新建一个容器重新挂上root/data,就可以恢复宿主机的信息到容器中,类似于文件共享。这就是数据卷

# 2.比如容器中跑的django,也可以做映射到外部宿主机上,这样在宿主机中装git,拉去最新的代码,只要重启一下容器,django就能跑最新的代码了,可以实现快速更新

docker run -di  --name=mycentos2_3 -v /root/test:/home centos:centos7
# 以后操作宿主机目录和操作容器目录会相互影响(在-v后面添加宿主机和容器的映射目录)

# 查看容器信息
docker inspect 容器名字/容器id
# 查看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id/名字

#主机内部的容器会公用一个虚拟的网关,宿主机本身也有一个,并且和容器共享另外这个虚拟的ip,这就是一个小的局域网,因此容器间可以通信方便

# 删除容器
# 停止才能删
docker rm 容器名字/id

# 删除镜像,如果有容器,能删除吗?支持,可以强制删,但是不推荐
docker rmi -f centos:centos7


自动化运维脚本:人输命令,shell脚本,python:subprocess执行命令
自动化运维平台:web框架,在网页上点点点,就可以完成一些事(宝塔:python2.7+flask做的)
正在运行的容器,启动


# 总结:
docker run  -di/-it --name=名字  -v 目录映射,可以有多个  images:tag
docker exec -it 名字 /bin/bash
docker cp
docker stop/start/restart 容器名字
docker rm 容器名字
docker inspect 容器名字

容器与容器直接可以是相互隔离的,每个容器里面装地方软件可以不一样,相互也可以不影响

容器映射一个端口,外部访问宿主机的时候可以转到容器中访问容器中的软件

容器不可以直接拿到另外一个宿主机上执行,但是可以备份转成镜像,镜像就包含了原来容器中的环境,就可以放在另一个装有docker的宿主机上,实现快速集群化部署,避免了环境的不一致等影响(补充:go更香一点,直接放可执行文件,但是也要考虑下redis等)

可以将mysql,nigx,redis等等分别装在不同的容器中,做好容器间的通信,有利于后面的项目完善

 

 

三.Docker应用部署

# mysql服务 在docker中运行 -e表示环境变量,root密码,这个环境变量不加就会报错,一启动容器就停止
docker run -id --name=mysql1 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# redis服务 在docker中运行
docker run -id --name=myredis -p 6379:6379 redis

# docker中部署django项目 nginx + django +uwsgi

映射成功后,通过虚拟机的ip和宿主机的33306端口,账号为root,密码为123456,就能链接到容器中的mysql数据库了,也可以进入容器直接操作数据库

 

 

四.迁移备份

# 把容器打包成镜像
docker run -di --name=mydjango python:3.6
 
# 安装django环境
pip install django==1.11.9
apt-get update
apt-get install vim

# 把容器打包成镜像
docker commit 容器名字 镜像名字
docker commit mydjango mydjango_i

# 基于镜像再跑起容器
docker run -di --name=mydjango2 mydjango_i

# 把本地的镜像拷贝到其他机器上去,在跑起容器来
# 打成一个tar包,压缩一下(在当前目有个mydjango.tar)
docker  save -o mydjango.tar mydjango_i

# copy这个压缩包到任意的机器上(装了docker)
根据压缩包,恢复成镜像
docker load -i mydjango.tar

容器里装了python3.6 mysql,django, uwsgi ,redis 项目在里面---》镜像--》容器


 

 

 

 

 

posted @ 2020-05-02 16:34  Mr江  阅读(904)  评论(0编辑  收藏  举报