Docker-基础

一、docker基本组成

镜像(image)

镜像就好比是一个模板,可以通过这个模板来创建容器服务。

比如tomcat镜像==》run==》tomcat01容器(提供服务)。

可以通过这个镜像可以创建多个容器(最终服务的运行就是在容器中)

容器(container)

利用容器技术,独立运行一个或者一个组应用。通过镜像来创建。目前可以将其理解为一个简易版的各种环境

仓库(repository)

存放镜像的地方,分共有仓库和私有仓库

Docker与VM的比较

1.docker有比虚拟机更少的抽象层
2.docker直接使用宿主机的内核

二、docker镜像基本命令

docker version  # 查看版本
docker info     # 查看详情

docker images   # 查看镜像
	参数:-a   显示所有镜像
		 -q   只显示镜像id
		 -aq  连用表示显示所有镜像的id


docker pull    # 从仓库拉去镜像,这个仓库可以自己配置源
docker pull mysql:5.7 拉取mysql,指定版本,没写版本默认最新版


docker rmi -f 镜像id 镜像id 镜像id 镜像id# rmi=remove images方便记忆
docker rmi -f $(docker images -aq) 删除所有镜像


docker image prune 参数
-a:删除所有未被使用的镜像
-f:强制删除

docker search 镜像名
docker search -f is-official=true redis 搜索官方镜像 f相当于filter
docker search -f starts=100 搜索收藏数大于一百的
docker search redis limit 5

docker tag [原镜像仓库url]/[原命名空间]/[原仓库名称]:[版本号] [新的名字]
docker tag redis:v2  # 例子

docker history 

三、docker容器命令

docker run 命令
        参数
        --name="test1"  #容器名字,将名称加入docker dns中
        -d  后台方式运行,即用守护进程的方式运行一个容器
        -it  使用交互方式运行,进入容器查看内容
        -p  小写,指定容器端口
            -p ip:主机端口:容器端口
            -p 主机端口:容器端口(常用)
            -p 容器端口
            容器端口

        -P  大写,随机端口
        -v  挂载存储卷
        比如部署django,文件可以使用我们主机的,而环境用docker的
        docker run  -v 主机目录:容器内目录 

        -e  在容器内设置一个环境变量
        docker run -d -e NGINX_VERSION=1.19.5 nginx:1.19.5
        比如我们登陆mysql的时候是需要账号密码的,我们在启动mysql服务的时候就可以利用-e把mysql的密码写
        进环境变量
        docker run -d -P -e:MYSQL_ROOT_PASSWORD=123456 mysql:latest 

        docker run -it centos /bin/bash # -it使用交互方式运行,进入容器查看内容

exit      # 退出容器
ctrl+p+q  # 容器不停止退出

docker ps # 当前在运行的容器
docker ps -a # 当前在运行的容器+曾经运行过的容器
        -n=2 显示最近的两个容器
        -q 显示容器的编号
        -aq 显示所有容器的编号


docker rm 容器id  # 删除容器
docker rm -f $(docker ps -aq)     # 删除所有容器
docker ps -aq | xargs docker rm   # 删除所有容器

启动和停止容器的操作
docker start 容器id     # 启动
docker restart 容器id   # 重启
docker stop 容器id 	  # 停止
docker kill 容器id  	  # 强制停止


后台启动容器
docker run -d  镜像名
docker run -d centos
# docker ps会发现centos已经停止了,是因为docker容器在后台运行的时候必要要有一个
# 前台进程,docker发现没有应用,就会自动停止


docker logs 	# 查看日志
# 造点日志数据
docker run -d centos /bin/sh -c "while true;do echo 123;sleep 1;done"
docker logs -ft --tail 10 容器id  # 打印最后十行日志


docker top 容器id  # 查看容器中的进程信息


docker inspect 容器id  # 查看docker容器的元数据,出来的是json格式



# 从容器中拷贝文件到主机上,拷贝的话和容器是否运行没关系,就算关了也可以拷贝出来
docker cp 容器id:容器内的路径 主机的路径



当容器生命周期结束的时候,有时候我们就不要这个容器了,比如我们stop掉一个容器,使用docker ps
命令确实看不到他了,但是使用-a参数,还是可以看到,说明这个容器停止之后还是在我们机子上占着空间的。
如果我们用再使用这个容器,其实重新run一个就行了,因为我们都是通过镜像来启动的,重新起一个就是一模一样的。
设置--rm参数即可

docker run --rm -d redis


# 保存我们的容器为镜像
export 和 import
docker export 容器id或容器名称 > 压缩包名字
docker import 压缩包 镜像名字可包含路径

docker export redis > test1.tar
docker import test1.tar test/redis1:v1

# export导出的是压缩包,commit导出的是镜像,是不同的

# 导出镜像为压缩包
docker save 镜像名字或者id > 压缩包名称
	参数-o 指定在一个压缩包内保存多个镜像
	docker save -o [压缩包名称] [镜像名1,镜像名2...]
docker load 压缩包名称
	参数-i 解压多个镜像的压缩包

docker save test/reids:v1 > test2.tar
docker load < test2.tar
docker load -i test2.tar


export和save区别
export只保存镜像,save是完全保存,包括名字,id,历史记录等等,所以两者保存的文件大小不同save会更大
import的时候可以重命名,load不行,原因基于第一条

save和export使用场景
1打包镜像一般用save,打包容器一般用export
2保存信息需要历史信息,名字等等,使用save

进入容器

# 进入当前正在运行的容器,一二常用,其他了解
1 exec  
2 attach
3 nsenter
4 ssh
# 通常我们容器是在后台方式运行,有时候需要进入容器,修改一些配置等
docker exec -it 容器id /bin/bash  # 方式一
docker attach 容器id  # 方式二


# 区别:
exec进入容器后开启一个新的终端,可以在里面操作,是常用的
attach进入容器正在执行的终端,不会启动新的进程。即创建一个管道,链接上容器内pid为1的进程

复制文件

1.宿主主机复制到容器
docker cp [宿主主机文件路径] [容器id]:[容器内路径]

2.容器复制到宿主主机(反过来)
docker cp [容器id]:[容器内路径] [宿主主机文件路径]

docker网络实现原理

首先通过网络命名空间来分隔开不同的容器,防止在同一个网络下的端口重复占用等问题,之后可以通过veth设备或者网桥还有iptables来实现网络的互通。
veth设备因为是一对一的,所以会导致当连接数过多的话数量增长太大。
网桥是相当与一个中间转发,需要通信的容器通过网桥来连接,转发

image-20201130171411545

四、linux网络

命名空间:网络名称空间,即在同一台linux系统上,生成不同的隔离的网络空间
veth设备对:对端与对端之间的网路合同,缺点是只能一对一,如果有很多需要连接,那么需要非常多设备对
网桥:提供一个网络空间,做一个中间转发的功能,其他网络空间可以使用网桥的网络,可以支持多对多
iptables(内核级):通过iptables规则转发网络,缺点:iptables规则复杂

五、docker网络

1 host
实现原理:docker容器名称空间网络连接根命名空间的网络
使用127.0.0.1这个本地网络,通过根名称空间内的lo互通
docker run -d --network host nginx
curl 127.0.0.1

2 container
实现原理:共享一个容器的网络给其他容器
docker run -d -it --name test01 busybox sh
docker run -d -it --network "container:test01" busybox sh

3 none
这个模式表示不提供任何其他网络,只有本地回环网络。这种网络模式可以适用于我们本地在做安全性要求很高的任务,不允许被外界打扰。
docker -run --network none [镜像id|镜像命令] [命令(默认执行镜像指定的命令)]
docker run -dit --network none busybox sh

4 网桥
实现原理:创建一个统一网络(相当于交换机),为与其相连的容器提供网络转发
docker network [参数]

查看系统网桥
docker network ls

创建网桥
docker network create 名字

查看网桥详细信息
docker network inspect 网桥名字

删除网桥
docker network rm 网桥名字或id

清理网桥
docker network prune #三个默认的网桥不会被删除

1.使用网桥的小案例

现在有四个容器服务nginx,redis,mysql,如果直接-p使用根名称空间的网络,可能会存在端口重复占用的情况,比如我们要起两个redis

所以我们使用网桥
创建网桥
docker network create testnet

连接网桥
docker run --network [网桥名称] [镜像id或名]
docker run -d --name nginx1 --network testnet nginx
docker run -d --name redis1 --network testnet redis
docker run -d --name mysql1 --network testnet -e MYSQL_ROOT_PASSWORD=123 mysql:5.7

# 创建一个测试网络是否互通的容器
docker run -dit --name busybox1 --network testnet busybox:latest sh
# 进入busybox1看看网络是否通了
docker exec -it busybox1 sh
ping mysql

2.dockerfile构建

利用dockerfile可以自定义我们镜像,这样就可以用于部署我们项目的环境。

docker build [参数] [自定义的镜像名字] [dockerfile的名字,一般默认就是Dockerfile,也可以自定义]

image-20201203173650636

posted @ 2020-12-01 13:15  王寄鱼  阅读(69)  评论(0编辑  收藏  举报