关于Docker的知识

Docker基础知识

1、docker是什么

Docker是一个开源的容器引擎,它基于LXC容器技术,使用Go语言开发。 源代码托管在Github上,并遵从Apache2.0协议。
Docker采用C/S架构,其可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。 简单来说:Docker就是一种快速解决生产问题的一种技术手段。
优点:
多: 适用场景多
快: 环境部署快、更新快
好: 好多人在用,东西好
省: 省钱省力省人工(123原则)
缺点:
依赖操作系统
依赖网络
银行U盾等场景不能用

2、docker的安装

1.配置软件源
cd /etc/apt/
# 备份source.list 文件
mv source.list sources.list.bak
# 新建source.list
vim source.list

# 此处使用阿里云源
# aliyun
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse partner
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse

# 安装依赖软件
apt-get update
apt-get install apt-transport-https ca-certificates curl software-properties-common -y

# aliyun源docker安装包
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# 检查
apt-get update

# docker软件安装
apt-cache madison docker-ce
# 安装docker
apt-get install docker-ce -y
# 可以指定版本安装
apt-get install docker-ce=<VERSION> -y

# 启动docker
systemctl start docker
systemctl status docker

# 测试是否安装成功
docker version

# 其他服务命令格式
systemctl [参数] docker
参数详解:
start   开启服务
stop    关闭
restart 重启
status  状态

删除docker命令:
yum remove docker-ce
rm -rf /var/lib/docker/
rm -rf /etc/docker

基本目录:
/etc/docker/                docker的认证目录
/var/lib/docker/            docker的应用目录

3、镜像管理

镜像就是一个只读文件,相当于一个等待运行起来的程序
# 搜索镜像
docker search [image_name]
docker search ubuntu

# 获取镜像
docker pull [image_name]
docker pull ubuntu
docker pull nginx

# 查看镜像
docker images <image_name>
docker images -a # 可以查看本地所有的images,包括删除的

# 镜像的重命名和删除
docker tag [old_image]:[old_version] [new_image]:[new_version]
docker tag nginx:latest smart-nginx:v1.0

docker rmi [image_id/image_name:image_version]
docker rmi 3fa822599e10

# 清除状态为dangling的镜像
docker image prune
# 移除所有未被使用的镜像
docker image prune -a
# 删除部分镜像
docker image prune -a --filter "until=24h"

# 导出镜像  docker save 会保存镜像的所有历史记录和元数据信息
docker save -o [包文件] [镜像]
docker save [镜像1] ... [镜像n] > [包文件]
docker save -o nginx.tar sswang-nginx

# 导入镜像
docker load < [image.tar_name]
docker load --input [image.tar_name]
docker load < nginx.tar

4、容器管理

容器是什么? 容器就类似于我们运行起来的一个操作系统,而且这个操作系统启动了某些服务。 
这里的容器指的是运行起来的一个Docker镜像。
# 查看容器
docker ps

# 启动容器
docker run <参数,可选> [docker_image] [执行的命令]
# -d  以后台守护的方式启动容器
docker run -d nginx
# 在生产过程中,常常会出现运行和不运行的容器,使用 start 命令开起一个已关闭的容器
docker start [container_id]

# 关闭容器
docker stop 8005c40a1d16

# 删除容器
docker rm 1a5f6a0c9443
# 强制删除,正在运行的容器也删除
docker rm -f 8005c40a1d16
# 删除部分容器
docker container prune --filter "until=24h"
# 批量关闭容器
docker rm -f $(docker ps -a -q)

# 创建并进入容器
docker run --name [container_name] -it [docker_image] /bin/bash
docker run -it --name smart-nginx nginx /bin/bash
'''
参数详解
--name:给容器定义一个名称
-i:则让容器的标准输入保持打开。
-t:让docker分配一个伪终端,并绑定到容器的标准输入上
/bin/bash:执行一个命令
'''
# 退出容器
exit
Ctrl + D

# 手工进入容器
docker exec -it 容器id /bin/bash
docker exec -it d74fff341687 /bin/bash

# 基于容器创建镜像
docker commit -m '改动信息' -a "作者信息" [container_id] [new_image:tag]
# 1.进入容器并创建文件
docker exec –it d74fff341687
mkdir /smart
exit
# 2.创建一个镜像
docker commit -m 'mkdir /smart' -a "smart" d74fff341687 sswang-nginx:v0.2
# 3.查看镜像
docker images
# 4.启动一个容器
docker run -itd smart-nginx:v0.2 /bin/bash
# 5.进入容器进行查看
docker exec –it ae63ab299a84
ls

# 查看日志
docker logs [容器id]
# 查看容器全部信息
docker inspect [容器id]
# 查看容器网络信息
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 930f29ccdf8a

5、仓库管理

仓库就类似于我们在网上搜索操作系统光盘的一个镜像站。这里的仓库指的是Docker镜像存储的地方。

Docker的仓库有三大类:
公有仓库:Docker hub、Docker cloud、等
私有仓库:registry、harbor等
本地仓库:在当前主机存储镜像的地方。
docker login [仓库名称]
docker pull [镜像名称]
docker push [镜像名称]
docker search [镜像名称]

# 私有仓库部署
# 1.下载registry镜像
docker pull registry
# 2.启动仓库容器
docker run -d -p 5000:5000 registry
# 3.检查容器效果
curl 127.0.0.1:5000/v2/_catalog
# 4.配置容器权限
# vim /etc/docker/daemon.json
{"registry-mirrors": ["http://74f21445.m.daocloud.io"], "insecure-registries": ["172.16.179.131:5000"]}
# 5.重启docker服务
systemctl restart docker
systemctl status docker


# 向私有仓库上传镜像
# 启动仓库容器
docker start register_id
# 标记镜像
docker tag ubuntu 172.16.179.131:5000/ubuntu-14.04-mini
# 提交镜像
docker push 172.16.179.131:5000/ubuntu-14.04-mini
# 下载镜像
docker pull 172.16.179.131:5000/ubuntu-14.04-mini

6、数据管理

docker的镜像是只读的,虽然依据镜像创建的容器可以进行操作,但是我们不能将数据保存到容器中,
因为容器会随时关闭和开启,那么如何将数据保存下来呢?
就是将宿主机的某个目录,映射到容器中,作为数据存储的目录,我们就可以在宿主机对数据进行存储 
缺点是:太单一了
# -v 参数的作用是将宿主机的一个目录(绝对路径)作为容器的数据卷挂载到docker容器中
# 使宿主机和容器之间可以共享一个目录,如果本地路径不存在,Docker也会自动创建。
docker run -itd --name [容器名字] -v [宿主机目录]:[容器目录] [镜像名称] [命令(可选)]
docker run -itd --name test1 -v /tmp:/test1 nginx

# 可以直接映射文件
echo "file1" > /tmp/file1.txt
docker run -itd --name test2 -v /tmp/file1.txt:/nihao/nihao.sh nginx
docker exec -it 84c37743 /bin/bash
root@84c37743d339:/# cat /nihao/nihao.sh
file1

'''
数据卷容器实践
让其他应用容器挂载在同一个数据卷容器中
注意:数据卷容器不启动。
'''
# 1.创建数据卷容器
docker create -v [容器数据卷目录] --name [容器名字] [镜像名称] [命令(可选)]
docker create -v /data --name v-test nginx

# 2.创建两个应用容器,同时挂载数据集容器
docker run --volumes-from [数据卷容器id/name] -itd --name [容器名字] [镜像名称] [命令(可选)]
# 创建 vc-test1 容器
docker run --volumes-from 4693558c49e8 -itd --name vc-test1 nginx /bin/bash
# 创建 vc-test2 容器
docker run --volumes-from 4693558c49e8 -itd --name vc-test2 nginx /bin/bash

# 3.确认容器卷是否共享
# 进入vc-test1,操作数据卷容器
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
root@c408f4f14786:/# echo 'v-test1' > /data/v-test1.txt
root@c408f4f14786:/# exit

# 进入vc-test2,确认数据卷
~# docker exec -it vc-test2 /bin/bash
root@7448eee82ab0:/# ls /data/
v-test1.txt
root@7448eee82ab0:/# echo 'v-test2' > /data/v-test2.txt
root@7448eee82ab0:/# exit

# 回到vc-test1进行验证
~# docker exec -it vc-test1 /bin/bash
root@c408f4f14786:/# ls /data/
v-test1.txt  v-test2.txt
root@c408f4f14786:/# cat /data/v-test2.txt
v-test2

# 回到宿主机查看/data/目录
~# ls /data/
~#
'''
结果证明:容器间可以共享数据卷容器,不过数据是保存在数据卷内,并没有保存到宿主机的文件目录中.
'''

7、网络管理

1)端口映射简介
默认情况下,容器和宿主机之间网络是隔离的,我们可以通过端口映射的方式,将容器中的端口,映射到宿主机的某个端口上。
这样我们就可以通过 宿主机的ip+port的方式来访问容器里的内容
2)端口映射种类
随机映射 -P(大写)
指定映射 -p 宿主机端口:容器端口
'''
随机映射实践
'''
docker run -d -P [镜像名称]
docker run -d -P nginx
# 查看映射状态信息
docker ps
# 指定主机随机映射
docker run -d -p [宿主机ip]::[容器端口] --name [容器名称] [镜像名称]
docker run -d -p 172.16.179.130::80 --name nginx-2 nginx

'''
指定映射实践
'''
docker run -d -p [宿主机ip]:[宿主机端口]:[容器端口] --name [容器名字] [镜像名称]
docker run -d -p 172.16.179.130:1199:80 --name nginx-1 nginx
# 查看新容器ip
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ba45f430a277

# 多端口映射方法
docker run -d -p [宿主机端口1]:[容器端口1]  -p [宿主机端口2]:[容器端口2] --name [容器名称] [镜像名称]
docker run -d -p 520:443 -p 6666:80 --name nginx-3 nginx

8、DockerFile

Dockerfile类似于脚本,可以将docker镜像,使用自动化的方式实现出来。

Dockerfile 使用准则
1)大: 首字母必须大写D
2)空: 尽量将Dockerfile放在空目录中。
3)单: 每个容器尽量只有一个功能。
4)少: 执行的命令越少越好。

Dockerfile 基础四指令
1)基础镜像信息 从哪来?
2)维护者信息 我是谁?
3)镜像操作指令 怎么干?
4)容器启动时执行指令

基础指令详解
FROM 是 Dockerfile 里的第一条而且只能是除了首行注释之外的第一条指令。
FROM <image>
FROM <image>:<tag>

MAINTAINER 指定该dockerfile文件的维护者信息。类似我们在docker commit 时候使用-a参数指定的信息。
MAINTAINER <name>

RUN 表示当前镜像构建时候运行的命令
RUN <command>      (shell模式)
RUN["executable", "param1", "param2"]。        (exec 模式)

EXPOSE 设置Docker容器对外暴露的端口号,Docker为了安全,不会自动对外打开端口
如果需要外部提供访问,还需要启动容 器时增加-p或者-P参数对容器的端口进行分配。
EXPOSE <port> [<port>...]

ENTRYPOINT 每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。
ENTRYPOINT ["executable", "param1","param2"]     (exec 模式)
ENTRYPOINT command param1 param2                 (shell模式)

ADD 将指定的文件复制到容器文件系统中的
src 指的是宿主机,dest 指的是容器
如果源文件是个压缩文件,则docker会自动帮解压到指定的容器中(无论目标是文件还是目录,都会当成目录处理)。
    ADD <src>... <dest>
    ADD ["<src>",... "<dest>"]

COPY 单纯复制文件场景,Docker推荐使用COPY。
    COPY <src>... <dest>
    COPY ["<src>",... "<dest>"]

VOLUME VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。
通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
VOLUME ["/data"]

ENV 设置环境变量,可以在RUN之前使用,然后RUN命令时调用,容器启动时这些环境变量都会被指定。
    ENV <key> <value>
    ENV <key>=<value> ...

WORKDIR 切换目录,为后续的RUN、CMD、ENTRYPOINT 指令配置工作目录,相当于cd
可以多次切换(相当于cd命令),
也可以使用多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /path/to/workdir               (shell 模式)

'''
DockerFile实践
构建Django环境
'''
""" DockerFile文件内容
# 基础镜像
FROM ubuntu
# 镜像作者
MAINTAINER Smart.Li smartli_it@itcast.cn
# 执行指令
ADD ./demo /demo
WORKDIR /demo
RUN apt-get update && apt-get install python3 -y && apt-get install python3-pip -y && pip3 install -r requirements.txt
# 开放端口
EXPOSE 8000
# 入口
ENTRYPOINT python3 manage.py runserver 0.0.0.0:8000
"""
# 进行Dockerfile文件所在目录,创建镜像
docker build -t django:v1.0 .
#使用创建的镜像启动容器
docker -d -p 8000:8000 django:v1.0

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值