抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

安装

windows平台

mac

Centos

由于最新的CentOS 8 将于 2021 年底结束,后续没有开源计划,维护无法得到保障,对于新机器建议直接使用ubuntu或者debian

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/1626781https://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镜像

image.png

push

image.png

images

列出了本地的镜像

image.png

**REPOSITORY:**表示镜像的仓库源

**TAG:**镜像的标签

**IMAGE ID:**镜像ID

**CREATED:**镜像创建时间

**SIZE:**镜像大小

tag

image.png

build

见下方dockerfile示例

rmi

删除镜像

image.png

例如我想搭建gitlab,搜索有哪些gitlab的镜像

image.png

tag

build

save/load

save

image.png

load

image.png

import

image.png

history

image.png

容器

run

image.png

create

image.png

ps

image.png

rm

删除容器

image.png

exec

执行命令

image.png

进入容器

image.png

stop/start/restart

stop

image.png

start

image.png

restart

image.png

pause/unpause

image.png

kill

image.png

logs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看最近100条
docker logs --tail=100 容器id

# 查看指定时间以后的日志
dokcer logs --since="2021-11-11T00:00:00" 容器id

# 查看最近10分分钟的日志
docker logs --since 10m 容器id

# 查看指定时间以前的日志
dokcer logs --until="2021-11-11T00:00:00" 容器id

# 持续跟踪
docker logs -f 容器id

查看最近100条

image.png

inspect

image.png

image.png

range遍历

image.png

index取下标

image.png

top

image.png

diff

image.png

cp

image.png

反向拷贝

image.png

commit

image.png

其他

info

image.png

version

image.png

system

image.png

分别列出了镜像,容器,数据卷占用的空间。

network

image.png

示例

使用docker搭建jenkins

拉取镜像

1
docker pull jenkinsci/blueocean

查看本地镜像,已经拉取了

image.png

根据该镜像生成一个容器并启动

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查看所有容器,可能容器发生异常已退出~)

image.png

查看容器日志

image.png

可以看到jenkins第一次启动,正在初始化

现在,先把nginx配一下,让nginx转发到本机的18080端口,也就是jenkins的服务。

这边简单配一下,将8080就代理到本机的18080

image.png

在配置文件的http块中插入

1
2
3
4
5
6
7
8
9
10
upstream real_jenkins {
server 127.0.0.1:18080;
}
server {
listen 8080;
server_name 这里写IP或者域名;
location / {
proxy_pass http://real_jenkins;
}
}

浏览器访问下进入jenkins的部署页面

image.png

将刚刚复制的密码粘贴进去

如果没有复制也没关系,页面给出了密码地址,咱们进入容器去捞一下

1
2
3
docker exec -it 容器的id bash
# 进入容器后
cat /var/jenkins_home/secrets/initialAdminPassword

image.png

如果不想进入容器也可以直接执行shell哦

1
2
# 这样也可以拿到初始的管理员密码
docker exec -it 77ae93362c6e ls /var/jenkins_home/secrets/initialAdminPassword

OK,拿到初始的管理员密码后就可以玩转jenkins了,后面的步骤内容跟平时使用war部署jenkins一样,就不再叙述了。

使用Dockerfile自制sqlite3镜像

https://docs.docker.com/engine/reference/builder/

编写dockerfile,保存为sqlite3_dokcerfile

1
2
3
4
5
6
7
FROM ubuntu:trusty
RUN sudo apt-get -y update
RUN sudo apt-get -y upgrade
RUN sudo apt-get install -y sqlite3 libsqlite3-dev
RUN mkdir /db
RUN /usr/bin/sqlite3 /db/dome.db
CMD /bin/bash

生成镜像

1
docker build -f /home/docker/sqlite3_dokcerfile -t sqlite:3 .

image.png

查看一下,本地已经有了

image.png

容器互连

新建网络

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
两个容器为sqlite3和jenlins,id分别0222e7e112f4和77ae93362c6e,端口分别为1433和8080
# 新建网络
docker network create -d bridge "test-network"

# 两个容器都加入该网络
docker network connect test-network 0222e7e112f4
docker network connect test-network 77ae93362c6e

# 查看ip
# sqlit3容器 输出172.18.0.2
docker inspect -f '{{(index .NetworkSettings.Networks "test-network").IPAddress}}' 0222e7e112f4


# jenkins容器 输出172.18.0.3
docker inspect -f '{{(index .NetworkSettings.Networks "test-network").IPAddress}}' 77ae93362c6e

# 进入sqlite3容器
docker exec -it 0222e7e112f4 bash

# ping jenkins所在容器
ping 172.18.0.3 # 正常

# 访问 jenkins所在容器端口
telnet 172.18.0.3 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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装docker compose
apt install docker-compose

# 拉取mysql镜像
docker pull mysql

# 拉取一个python3.6运行环境的镜像
docker pull python:3.6

# 进入你的flask项目目录
cd flaskpath

# 生成requirement.txt
pip freeze > requirements.txt

创建flask镜像的dockerfile

(. 表示当前目录,我的当前目录为/home/docker/flask,包含了run.py, Dockerfile,requirements.txt三个文件)

如果要制作镜像docker build -t flask -f Dockerfile . 但这里交给docker compose来做

1
2
3
4
5
6
7
FROM python:3.6
ADD run.py /root
ADD requirements.txt /root
WORKDIR /root
RUN /usr/local/bin/python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
EXPOSE 5000
CMD ["python","/root/run.py"]

下面开始编写下Mysql的Dockerfile以便于docker-compose中使用

Mysql的Dockerfile

1
2
FROM mysql
EXPOSE 3306

如果只是flask使用的话,mysql的3306没必要暴露

编写docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: '3'
services:
mysql:
build: ./mysql
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=flask
- MYSQL_USER=flask
- MYSQL_PASSWORD=123456
restart: always
flask:
build: ./flask
ports:
- "5000:5000"
links:
- mysql:mysql
restart: always
# 执行 这里加上-d保持后台运行,否则ctrl+c 容器也退出了。
docker-compose -f docker-compose.yml up -d

image.png

image.png

image.png

image.png

后续扔然可以执行 docker-compose -f docker-compose.yml up -d 来启动容器

本地已经有了镜像不会重复生成,但如果有更新会进行更新需带上参数 –force-recreate –build

访问下

image.png

访问成功,同时连接到mysql查看flask创建的表也创建完成。

注意事项

数据卷持久化

当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

这也意味着,新建容器后发现要加一些东西又不想抛弃已经有的一些数据,可以用新配置重新run一个容器出来。

清理数据卷: 停止容器–>删除容器–>删除挂载卷

1
2
3
docker stop 容器id // 暂停容器实例
docker rm 容器id // 移除容器实例
docker volume rm 容器id // 删除自定义数据卷

更多自行搜索或参考https://blog.csdn.net/geek_xiong/article/details/91995051

容器的时区

如果是拉的别人的镜像,时区可能不一样,会有一些问题,需要设置下。

docker中调用docker

例如docker启动的jenkins,在jenkins使用docker,无限套娃…

将dokcer指令挂载到容器中,并赋予执行权限

1
2
3
4
5
6
# 启动命令中加入或dockerfile中加入
-v /var/run/docker.sock:/var/run/docker.sock
-v /usr/bin/docker:/usr/bin/docker

# 赋予docker.sock其他角色权限
sudo chmod a+rw /var/run/docker.sock

镜像通常不包含数据

通常来说,镜像包含了基础的运行环境,数据一般不放在镜像里。

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

评论