Docker学习中…(1)更新完成
Docker的三大组件
镜像 -> image
容器 -> container
仓库 -> repository
镜像
镜像image:(image是只读的)
>可以使用DockerFile来build出来一个image
>也可以使用docker pull来从Docker Hub上拉取镜像:"docker pull 镜像名:[tag]",tag可以省略默认会取仓库中最新版本,会随仓库中的最新版本变更而变更,生产不可以用,不稳定
例: sudo docker pull mysql:5.6
>>如果权限不够需要加sudo,可以使用分组命令将docker分组处理
sudo groupadd docker
sudo gpasswd -a 用户名 docker
运行docker version
如果不行就重启docker服务: service docker restart
还不行就重启系统sudo reboot
>可以使用inspect来获取镜像的详细信息,包括作者、适应架构、各层(layer)的数字摘要,返回的json串,可以使用-f后面加json串中的key来获取value
命令: 返回所有信息:"docker inspect 镜像名",读取指定key的value:"docker inspect -f{{"参数"}} 镜像名"
例(所有信息):
docker inspect lijinlong666/dockerpythontest1
例(json串中的Size):
docker inspect -f{{".Size"}} lijinlong666/dockerpythontest1
>可以使用history来查看镜像的各层具体内容
例:
docker history lijinlong666/dockerpythontest1
>删除和清理镜像可以使用rmi或者prune命令
rmi: 删除没有依赖容器的镜像可以使用:"docker rmi 镜像名或id",可以加参数-f来强制忽略依赖来删除数据:"docker rmi -f 镜像名或者id"
prune: 清理系统遗留下来的临时镜像和一些没有被使用的镜像:"docker image prune 参数"{
可以加参数: -a:删除所有无用镜像,不止临时镜像
-f:强制删除镜像,不需要确认
-filter: 删除符合给定过滤器的镜像
例: docker image prune -f
}
>创建镜像:
>>基于已有镜像容器创建镜像:
命令: "docker commit 容器名或容器id 新镜像名(库):版本"
可以加参数以设置更多信息:
-a,--author="":作者名->如: "docker commit -a "作者" 容器名或容器id"
-c,--change=[]:提交的时候执行的Dockerfile指令->如:"CMD、RUN等"
-m,--message="":提交消息->如:"docker commit -m "消息" 容器名或容器id"
-p,--pause=true:提交时暂停容器运行
例: docker commmit -a "lijinlong" -m "测试基于已有镜像创建新镜像" -p cca5386de02e lijinlong666/test:1.0
>>基于本地模板导入镜像
命令:
cat 镜像.tar.gz|docker import - 镜像名
>>基于Dockerfile来创建镜像
命令:
vim Dockerfile
docker build -t 镜像名 目录->如:docker build -t ljl/text .
>存出镜像
将镜像存储为tar文件
命令: docker save [参数] 输出镜像名 镜像名
例: docker save -o ubuntu_18.04.tar ubuntu:18.04
参数有 -o,-output string
>载入镜像
将镜像文件导入到镜像库中,导入的镜像与原镜像一致
docker load [参数] 镜像文件名
例: "docker load < ubuntu_18.04.tar"或"docker load -i ubuntu_18.04.tar"
参数有: -i,-input string
>上传镜像
>>上传镜像默认上传到Docker Hub上
>>要上传必须先登录:"docker login"
>>上传的镜像可以使用:"docker push 用户名/镜像名:版本"
容器
>container(container是可读可写的,因为要运行程序或安装软件)
>是通过image创建的,所以必须有image
>类比与面向对象->image是一个类,container是类的实例化对象
>各自负责的功能: image是负责app的存储和分发的,container是负责运行app的
>可以通过docker container ls 来查看运行中的容器
>可以通过docker container ls -a (或: docker ps -a)来查看运行中和运行后终止的容器
>其中command下显示的是运行容器所执行的命令(也就是CMD(运行后就结束))
>运行容器:
由于直接使用"docker run 镜像名"执行的容器运行完就直接关闭了,没有交互式的运行。所以可以使用"docker run -it 镜像名 /bin/bash"来交互式的运行容器,并进入容器中。可以使用"ctrl+d"或者"exit"来退出交互式容器
>>docker run执行容器时有时由于命令无法执行容器会出错直接退出,可以查看错误代码来判断是什么原因,默认情况常见的错误:
>>>125:Docker daemon执行出错,例如:指定了不支持的Docker命令参数
>>>126:所指定的命令无法执行,例如:权限出错
>>>127:容器内命令无法找到
命令执行出错后会默认返回命令的退出错误码
>进入运行中的容器:docker exec -it 容器id /bin/sh
>创建容器:
>>"docker [contarner] create -it 镜像名",例:{docker create -it ubuntu:latest}创建出来的容器处于停止状态,可以使用"docker start 容器id",来启动容器
>>"docker run 镜像名 要执行的命令",例:{docker run ubuntu /bin/echo 'hello docker'},等同于创建容器后执行。
>删除容器: docker rm 容器id或容器名
>>批量删除容器:
docker container ls -aq可以显示除所有容器的id,效果和"docker container ls -a| awk {'print$1'}显示第一列是一样的
直接使用: docker rm $(docker container ls -aq)
如果有启动也有启动后的容器,我们要删除启动后的容器可以使用:
docker rm $(docker container ls -f "status=exited" -q)
>>删除指定容器:docker rm 容器id或容器名
>>>删除时可以挂载的参数:
-f 是否强行终止并删除一个运行中的容器,默认为false
-l 删除容器的连接,但保留容器
-v 删除容器挂载的数据卷
如: docker rm -f 容器id
>>删除所有容器:docker rm $(docker ps -aq)
>显示运行中的容器: docker ps,加-a可以显示执行完的container,加-q可以显示第一行id
>查看容器运行日志:
docker logs 容器id
>暂停容器:
docker pause 容器id
暂停后启动容器: docker unpause 容器id
>终止容器:
docker stop 容器id
终止后可以重新启动: docker start 容器id
重启容器[先停止,然后启动]: docker restart 容器id
>容器的导入导出[可对容器导出后进行迁移然后导入]:
>>导出:
docker export [-o 导出文件名.tar] 容器id
-o 可以用来指定导出后的文件名
>>导入:
docker import 镜像文件名 - 仓库名/镜像名:[tag]
>查看容器
>>>查看容器具体信息:"docker inspect 容器id"(会以json格式返回包括容器id、创建时间、路径、状态、镜像、配置等在内的各项信息)
>>>查看容器内进程:"docker top 容器id"(和在linux系统中top类似)
>>>查看统计信息:"docker stats 容器id"(会显示cpu、内存、存储、网络等情况的统计信息)
>>>>参数:
-a 输出所有容器统计信息,默认仅在运行中的容器
-no-stream 不持续输出,默认会自动更新持续实时结果
-no-trunc 不截断输出信息
>从容器中复制文件到本地
>>docker cp 本地 容器
>>docker cp 容器 本地
>查看容器的文件系统变更
>>docker diff 容器名或容器id
>查看容器端口所映射的主机端口
>>docker port 容器名或容器id
>更新容器配置
>>docker update 参数 容器名或容器id
>>>参数查看: docker update --help
>>>例:docker update --blkio-weight 100 容器名
[生产环境状态下,为提高可用性和安全性,要为容器配置合理的资源来管理容器的消耗。还要指定合适的容器重启策略,来自动重启退出的容器。还可以使用HXPorxy等辅助工具来实现负载均衡,自动切换故障的容器。]
Docker仓库
>概述:
>>注册服务器(Registry)是存放仓库的地方(注册服务器可以存在多个仓库),
仓库(Repository)是存放镜像的地方(仓库可以存放多个镜像)。
>>例:一个仓库地址
private-registry.com/repositoryname
private-registry.com是注册服务器
repositoryname是仓库名
>Docker Hub公共镜像市场(官方)
>>地址:hub.docker.com
登录平台注册,然后可以在linux服务器上使用"docker login"来进行登录。
退出登录可以使用"docker logout"。
登录后本地会自动创建.docker/config.json文件,用来存放用户的认证信息。
登录成功后就从Docker Hub上可以上传镜像了
>>查询镜像
docker search 镜像名
一般官方的为不带仓库的,非官方的带仓库名
centos 官方
lijinlong666/centos 非官方
>>拉去镜像
docker pull 镜像名:标签[不加标签默认latest]
>>自动创建镜像(自动更新)
自动更新是Docker Hub提供的自动化服务,主要解决的是代码项目发生变化后自动重新构建镜像,可以通过用户给定的一个目标网站(目前只支持GitHub和BitBuchet)。
>第三方镜像市场(阿里云、腾讯云、网易云等)
>>阿里云:https://dev.aliyun.com/search.html
>搭建本地私有仓库
>>待补充
练习
自己通过Dockerfile创建一个练习docker image
> 创建一个hello.c文件(其他文件可以,但需要环境存在)
>> yum install -y gcc #c语言需要的环境
yum install -y glibc-static #c语言需要的环境
vim hello.c
#include<stdio.h>
int main()
{
printf("docker demo1");
}
> 将写好的c语言文件编译成可执行文件
>> gcc -static hello.c -o hello
> 编写Dockerfile
>> FROM scratch #不依赖其他
ADD hello / #add到hello的根目录下
CMD ["/hello"] #根目录下的hello
> build Dockerfile
>> docker build -t lijinlong666/hello .
> 查看docker image
>> docker images
> 运行image
>> docker run lijinlong666/hello
容器:
构建自己的Docker镜像
例:
通过pull下来的镜像,进行交互式运行后在其中修改后(比如:yum install -y vim),然后commit出一个镜像
(假设我们有一个centos的镜像)
docker run -it centos #交互式运行centos镜像
yum install -y vim #安装vim
exit #退出镜像
docker ps -a #查看容器(包含已运行)
docker commit 容器names 新镜像名 #commit一个容器到新镜像
docker images #查看所有镜像
例:
通过Dockerfile来构建镜像
vim Dockerfile #创建编写Dockerfile
FROM centos #依赖centos
RUN yum install -y vim #安装vun
docker build -t lijinlong666/centos-vim . #通过build新镜像
docker images #查看所有镜像
Docker网络
列举当前机器上有那些网络:
docker network ls