安装
由于最新的CentOS 8 将于 2021 年底结束,后续没有开源计划,维护无法得到保障,对于新机器建议直接使用ubuntu或者debian
常用命令
命令 | 说明 | |
---|---|---|
login | docker login OPTIONS SERVER | 登录到一个dokcer镜像仓库-u username 用户名-p passwd 密码 |
logout | docker logout | 从镜像仓库登出 |
pull | docker pull 镜像名字 | 从仓库拉取镜像,默认拉取的都是latest tag |
push | dokcer push 镜像NAME:TAG | 镜像推送到仓库 |
images | docker images | 列出了本地的镜像 |
tag | docker 镜像id 仓库名:TAG | 标记本地镜像,将其归入某一仓库 |
build | docker build OPTIONS PATH |URL| | 使用 Dockerfile 创建镜像 -f dockerfile 指定dockerfile文件-t 仓库名:TAG 指定仓库和tagdockerfile更多内容可参考 https://docs.docker.com/engine/reference/builder/ ,https://www.cnblogs.com/jhxxb/p/11445594.html |
ps | docker ps | 列出运行中的容器-a 列出所有容器-s 展示容器总大小 |
rmi | docker rmi 镜像id | 删除指定镜像 |
search | docker search 关键字 | 从docker仓库搜索可用镜像 |
save | docker save OPTIONS IMAGE | 将指定镜像保存成tar归档文件-o outputfile |
load | docker load OPTIONS | 导入使用 docker save 命令导出的镜像,恢复到某一状态–import, -i 指定导入的文件,代替STDIN–quiet, -q 精简输出信息 |
import | docker import PATH|URL 仓库名:TAG | 从归档文件中创建镜像,和load不同,import会创建新的镜像 |
history | docker history 镜像id | 查看指定镜像的创建历史-H 以可读的格式打印镜像大小和日期,默认为true-q 仅列出提交记录ID–no-trunc 显示完整的提交记录 |
run | docker run COMMAND | 运行一个新容器-d 后台运行容器,并返回容器ID-p port:port 指定端口映射,格式为:主机(宿主)端口:容器端口、-P 将容器端口随机映射到宿主机端口–name=”容器名字” 为容器指定一个名称-h “hostname” 指定容器的hostname–env-file=[] 从指定文件读入环境变量-m 设置容器使用内存上限-v, –volume 宿主机目录:容器目录 绑定卷,宿主机的卷映射到容器的目录 |
create | docker create –name 新容器id 镜像 | 创建一个新的容器但不启动它参数和run类似,不支持-d |
rm | docker rm 容器id | 删除指定容器 |
exec | docker exec COMMAND | 指定容器执行命令(也可用于进入容器)-d 分离模式: 在后台运行-i 即使没有附加也保持STDIN 打开-t 分配一个伪终端 |
stop | docker stop 容器id | 停止一个正在运行的容器 |
start | docker start 容器id | 启动一个已经存在的容器 |
restart | docker restart 容器id | 重启一个已经存在的容器 |
pause | docker pause 容器id | 暂停容器中所有的进程 |
unpause | docker unpause 容器id | 恢复容器中所有的进程 |
kill | docker kill -s KILL 容器id | 杀掉一个运行中的容器 |
logs | docker logs COMMAND | 查看日志–since “2021-11-11T00:00:00” 容器id 某段时间以后的日志–until “2021-11-11T00:00:00” 容器id 某段时间以前的日志–tail 10 容器id 最近10条-f 容器id 持续滚动最新日志 |
port | docker port OPTIONS 容器id | 列出指定的容器的端口映射 |
inspect | docker inspect COMMAND | 获取容器/镜像的元数据-f, –format=’’ 指定返回值的模板文件-s 显示总的文件大小–type=’’ 为指定类型返回JSONformat可参考https://www.jianshu.com/p/65377285662e |
top | docker top 容器id | 查看容器中运行的进程信息 |
diff | docker diff OPTIONS 容器id | 检查容器里文件结构的更改 |
cp | docker cp 宿主机数据 容器id:容器目录docker cp 容器id:容器数据 宿主机目录 | 用于容器与主机之间的数据拷贝 |
commit | docker commit OPTIONS 容器id 仓库名:TAG | 从容器创建一个新的镜像 -a “author name” 提交的镜像作者-m “comment” 提交时的说明文字-p 在commit时,将容器暂停-c 使用Dockerfile指令来创建镜像 |
attach | docker attach 容器id | 连接到正在运行中的容器 |
events | docker events OPTIONS | 从服务器获取实时事件-f 根据条件过滤事件 如 -f “a”=”b”–since=”” 从指定的时间戳后显示所有事件–until=”” 流水时间显示到指定的时间为止 |
wait | docker wait 容器id | 阻塞运行直到容器停止,然后打印出它的退出代码 |
export | docker export OPTIONS 容器id | 将文件系统作为一个tar归档文件导出到STDOUT-o OUTPUTFILE 导出文件 |
info | docker info | 显示 Docker 系统信息,包括镜像和容器数 |
version | docker version | 显示 Docker 版本信息 |
system | docker system COMMADN | 管理dockerdf 查看docker占用情况events 查看实时事件(例如容器创建,删除等均会实时显示)info 效果同docker infoprune 清理停止的容器,没用容器使用的网络,镜像,缓存更多prune用法可参考https://cloud.tencent.com/developer/article/1626781 , https://blog.csdn.net/gxf212/article/details/89676307 |
network | docker network COMMAND | 管理docker网络-d NETWORKTYPE 参数指定 Docker 网络类型,有 bridge、overlay。 connect networkname 容器id 把某容器加入到一个网络 create NETWORK 新建一个网络 disconnect networkname 容器id 把容器从一个网络剔除 inspect 展示一个或多个网络的信息 ls 列出所有网络 prune 删除所有未使用网络 rm 删除一个或多个网络 |
镜像
pull
例如拉取一个sqlite3镜像
push
images
列出了本地的镜像
**REPOSITORY:**表示镜像的仓库源
**TAG:**镜像的标签
**IMAGE ID:**镜像ID
**CREATED:**镜像创建时间
**SIZE:**镜像大小
tag
build
见下方dockerfile示例
rmi
删除镜像
search
例如我想搭建gitlab,搜索有哪些gitlab的镜像
tag
build
save/load
save
load
import
history
容器
run
create
ps
rm
删除容器
exec
执行命令
进入容器
stop/start/restart
stop
start
restart
pause/unpause
kill
logs
1 | 查看最近100条 |
查看最近100条
inspect
range遍历
index取下标
top
diff
cp
反向拷贝
commit
其他
info
version
system
分别列出了镜像,容器,数据卷占用的空间。
network
示例
使用docker搭建jenkins
拉取镜像
1 | docker pull jenkinsci/blueocean |
查看本地镜像,已经拉取了
根据该镜像生成一个容器并启动
1 | docker run -d -p 18080:8080 -p 50000:50000 -v ~/jenkins/jenkins_01:/var/jenkins_home jenkinsci/blueocean |
这条指令的意思是,依据镜像jenkinsci/blueocean,以后台模式启动一个容器,
容器的8080端口映射到宿主机的18080端口,容器的50000端口映射到宿主机的50000端口,
宿主机的~/jenkins/jenkins_01目录挂载到容器的/var/jenkins_home目录
查看运行中的容器 (如果没有使用docker ps -a查看所有容器,可能容器发生异常已退出~)
查看容器日志
可以看到jenkins第一次启动,正在初始化
现在,先把nginx配一下,让nginx转发到本机的18080端口,也就是jenkins的服务。
这边简单配一下,将8080就代理到本机的18080
在配置文件的http块中插入
1 | upstream real_jenkins { |
浏览器访问下进入jenkins的部署页面
将刚刚复制的密码粘贴进去
如果没有复制也没关系,页面给出了密码地址,咱们进入容器去捞一下
1 | docker exec -it 容器的id bash |
如果不想进入容器也可以直接执行shell哦
1 | 这样也可以拿到初始的管理员密码 |
OK,拿到初始的管理员密码后就可以玩转jenkins了,后面的步骤内容跟平时使用war部署jenkins一样,就不再叙述了。
使用Dockerfile自制sqlite3镜像
https://docs.docker.com/engine/reference/builder/
编写dockerfile,保存为sqlite3_dokcerfile
1 | FROM ubuntu:trusty |
生成镜像
1 | docker build -f /home/docker/sqlite3_dokcerfile -t sqlite:3 . |
查看一下,本地已经有了
容器互连
新建网络
1 | 两个容器为sqlite3和jenlins,id分别0222e7e112f4和77ae93362c6e,端口分别为1433和8080 |
除此之外docker1.9版本之前常用的是 –link来连接多个docker容器,最新的版本里推荐使用docker network。
使用Docker Compose定义运行多个容器
单个容器呢可以用dokcer build或者docker run来操作容器,而现在的服务都是微服务,即便不是微服务,一般也会把应用和数据库分开,应用在一个容器,服务器在一个容器,例如ELK的docker搭建就是三个容器: ElasticSearch镜像,Logstash镜像,Kibana镜像。
这边简单搭建一个flask+mysql的服务,flask和mysql在两个容器中。
先安装下docker compose
1 | 安装docker compose |
创建flask镜像的dockerfile
(. 表示当前目录,我的当前目录为/home/docker/flask,包含了run.py, Dockerfile,requirements.txt三个文件)
如果要制作镜像docker build -t flask -f Dockerfile . 但这里交给docker compose来做
1 | FROM python:3.6 |
下面开始编写下Mysql的Dockerfile以便于docker-compose中使用
Mysql的Dockerfile
1 | FROM mysql |
如果只是flask使用的话,mysql的3306没必要暴露
编写docker-compose.yml
1 | version: '3' |
后续扔然可以执行 docker-compose -f docker-compose.yml up -d 来启动容器
本地已经有了镜像不会重复生成,但如果有更新会进行更新需带上参数 –force-recreate –build
访问下
访问成功,同时连接到mysql查看flask创建的表也创建完成。
注意事项
数据卷持久化
当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。
这也意味着,新建容器后发现要加一些东西又不想抛弃已经有的一些数据,可以用新配置重新run一个容器出来。
清理数据卷: 停止容器–>删除容器–>删除挂载卷
1 | docker stop 容器id // 暂停容器实例 |
更多自行搜索或参考https://blog.csdn.net/geek_xiong/article/details/91995051
容器的时区
如果是拉的别人的镜像,时区可能不一样,会有一些问题,需要设置下。
docker中调用docker
例如docker启动的jenkins,在jenkins使用docker,无限套娃…
将dokcer指令挂载到容器中,并赋予执行权限
1 | 启动命令中加入或dockerfile中加入 |
镜像通常不包含数据
通常来说,镜像包含了基础的运行环境,数据一般不放在镜像里。
docker版本
早期的版本docker-io
最新的版本中社区版docker-ce,企业版docker-ee
Kubernetes,Docker,Docker Compose,Docker Swarm的区别
docker
一款以容器虚拟化技术为基础的软件
docker compose
用来做docker 的多容器控制,把繁复的操作一条命令完成,适用于单机
kubernetes
google开源的管理云平台中多个主机上的容器化的应用(不仅仅是docker),围绕容器的部署,管理,调度等一整套服务,适用于多机多集群,功能比较重,一般个人不建议使用。
https://www.kubernetes.org.cn/k8s
docker swarm
docker官方推出的管理docker集群的工具,不过基本没人用,主要还是kubernetes