Docker 基本使用

基本理解

镜像、容器和仓库

这三个是docker里常见的概念,镜像可以理解成一个个操作系统的安装包,而容器就是我们通过这些安装包安装好的操作系统,仓库则是网上很多存放各种镜像提供你下载的地方

docker是什么

docker就是一个存放了各种容器的平台,供我们来使用。可以理解成:docker从仓库下载下来各种镜像安装包,然后在docker平台上安装他们成容器并存放起来,接着我们就可以用这些根据我们需求选择的容器来做我们想做的事了

为什么要用docker

假如你要部署一个网站,那么你可能需要一台服务器,然后安装环境、配置七七八八的东西,是不是特别麻烦。这个时候有人在网上提供了配置好各种环境的系统,你只要根据需求下载你需要的系统下来就能快速部署你的网站,而且也不怎么费你电脑的资源,或者当你根据自己需求配置好这个系统,还可以再把它弄成新的镜像提供给和你要跑同样环境的人,你说这么好的东西是不是很心动

更多了解参考

http://dockone.io/article/6051

安装环境

配置要求

电脑开启虚拟化,如何查看是否开启参考:https://jingyan.baidu.com/article/48206aea6e9f9d216ad6b3c6.html

安装教程

windows参考:https://www.runoob.com/docker/windows-docker-install.html
(其他系统安装的也都在里面)

配置加速器

由于docker hub是国外的平台,如果不开启加速器,下载镜像的话贼慢,因此很有必要配置一下加速器来加速下载,配置参考:
https://blog.csdn.net/tjsahwj/article/details/88181779

入门示例

建议在配置完前面的加速器后再尝试,不然下载一个镜像得花不知道多久时间...,示例代码如下(按顺序敲就可以了):

$ docker-machine env
# 查看docker环境
$ eval $("E:\OFFICE\Docker Toolbox\docker-machine.exe" env)
# 执行环境
$ docker search python
# 搜索python的docker镜像,根据第一列的NAME来选择一个下载,这里选择第一个
$ docker pull python
# 下载python的镜像,也可以下载nginx的镜像,这个可能太大了
$ docker images
# 查看下载的镜像,可以发现多了一列python的
$ docker run -it python
# 可以看到进入了python的命令行,因为这个镜像进入的默认命令就是`python3`,因此会自动打开命令行
# 可以输入:`exit()`退出命令行
$ docker run --name aaa -it python /bin/bash
# 和刚才一样,都是创建python镜像的容器,不过这次给容器取名叫aaa,并且输入/bin/bash打开terminal终端
# 这个时候就可以输入各种linux系统的命令如:`ls`了,这个就是docker最主要的内容
# 退出时可以通过组合键(`ctrl+p+q`)、命令(`exit`)来退出,前者不关闭容器,后者关闭
$ docker ps
# 查看正在运行的容器,如果要查看所有容器,则后面加上:-a
# 在这里记下容器ID的前几位(只要前面不重复,1位2位都行)
# 前面run命令用了两次,第一个没取名,第二个取名了,所以第一个记下ID
# 假如容器ID是(c6789...),前两位就能判断出是这个容器,那么记下c6就行了
$ docker stop c6 first
# 关闭c6和first这两个容器
$ docker rm c6 first
# 删除这两个容器

通过上面的示例,应该可以大概了解docker是什么,其实可以理解成一个定制的操作系统(也不完全是,但是大体感觉差不多),比如配有java、python环境的操作系统,然后下载下来直接用,并且可以通过命令把我们本地的文件拷贝到里面去运行等等,总之就是个特别方便的东西啦

常用命令

查看版本信息
docker info
查看帮助
docker --help

注:
如果是想查看某个命令的使用帮助则可以使用:

docker 命令 --help
查看环境
docker-machine env
执行环境

查看命令的输出结果里,最后一句去掉注释符号(#)就是

搜索镜像
docker search 名称
// 举例:docker search nginx
下载镜像
docker pull 地址/名称
// 举例:docker pull ubuntu:13.10
// 举例2:docker pull hub.c.163.com/public/nginx:1.2.1
查看镜像
docker images
删除镜像
docker rmi 镜像ID(或:镜像名:tag名,下同)
docker rmi $(docker images -q)
// 一次性删除所有的镜像,-q参数获取所有镜像的ID
设置标签
docker tag 镜像ID 仓库名:标签名
// 举例:docker tag 860c279d2fec runoob/centos:dev
创建容器
docker run -绑定参数 IP:本机被映射端口:映射端口(可选) --name 容器命名(可选) -运行参数 镜像名 执行命令(/bin/bash为打开命令行)
// 举例:docker run -p 8080:80 --name nginx -it hub.c.163.com/library/nginx /bin/bash
// 执行该容器里的/bin/bash文件,即打开命令行交互窗口
// 举例2:docker run -d -p 5000:5000 training/webapp python app.py
// 执行该容器里的app.py文件
// 举例3:docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
// 比上面的多绑定了IP地址,以及选择udp
// 举例4:docker run -itv /home/test:/home python /bin/bash
// 将宿主机(docker环境的虚拟机)的/home/test文件夹挂载到容器的/home路径下
// (此时可以再配置本地磁盘的某个共享文件夹挂载到docker虚拟机的/home/test下,从而实现本机和容器的文件夹共享)

此时访问对应IP(默认为其提供的私有IP):本机被映射端口即可,若不知道IP,可以通过下面命令查看:

docker-machine ls

注:

-t   在容器内开启一个终端
-i   允许往容器内输入交互命令
-it  结合上面两条可以得出该参数代表进入该容器当中的终端运行
-d   代表后台运行
-p   将容器内部使用的端口映射到我们使用主机的指定端口上
-P   将容器内部使用的端口映射到我们使用主机的随机高位端口上
-v   指定本地共享目录挂载到容器目录当中
查看容器端口绑定
docker port 容器ID(前几位即可,只要不重名,容器名称也可以,后同) 端口号
退出容器
ctrl+p+q  // 退出不关闭容器
exit  // 退出并关闭容器
查看运行的容器
docker ps  // 查看正在运行的容器

注:

-a  查看所有运行过的容器
查看容器输出
docker logs 容器ID
重启容器
docker restart 容器ID
停止容器
docker stop 容器ID
docker kill 容器ID
删除容器
docker rm 容器ID
docker rm $(docker ps -q -a)
// 一次性删除所有的容器

注:
需要容器停止时才能进行删除操作

启动容器
docker start 容器ID
向容器发送命令
docker exec -d 容器ID 命令
进入容器
docker attach 容器ID

注:
进入容器的方法好几种,这个是比较常用的,其他详细可参考:
https://www.cnblogs.com/xhyan/p/6593075.html

查看容器IP
cat /etc/hosts  // 容器内部输入命令
拷贝本机文件到容器
docker cp 本地文件路径 容器名称:容器里的路径

参考:https://jingyan.baidu.com/article/09ea3ede52323fc0afde3956.html

制作并上传镜像

第一步:登录docker hub账号(没有创建一个:地址
docker login
第二步:创建本地自定义镜像
方法1:commit命令创建
docker commit -m "说明" 容器ID 新镜像名:标签
// 举例:docker commit -m "第一个自定义镜像" xxx dawsonenjoy/python:latest
// 建议镜像名以:docker hub账号名/仓库名来命名,不然后面上传镜像时容器出错

此时输入:docker images,就可以发现自己创建的镜像了,这种方法是根据容器来创建镜像,并且操作简易,个人比较推荐

方法2:通过dockerfile创建

步骤:

  • 新建Dockerfile文件:
touch Dockerfile
  • 编写Dockerfile文件:
# ------------------------
# 初始化配置
FROM xxx镜像
MAINTAINER xxx <xxx@xxx.com>
# 名字、邮箱

# ------------------------
# 执行语句
RUN 语句1
RUN 语句2

# ------------------------
# 配置环境
ENV xxx

# ------------------------
# 启动容器时执行的命令
CMD xxx

简单示例:

FROM dawsonenjoy/xxx:latest
MAINTAINER dawsonenjoy <dawsonenjoy@gmail.com>

# 安装vim
RUN apt-get update
RUN apt-get install vim

# 配置编码
ENV LANG C.UTF-8
  • 创建镜像:
docker build -t 镜像名:latest .
# 注意后面有个点别漏了

此时就可以通过docker images看到新建了刚才的镜像

详细可以参考下面链接:
https://www.cnblogs.com/qiaoyeye/p/10677136.html
https://www.cnblogs.com/lsgxeva/p/8746644.html
这种方法是根据镜像结合自定义命令来创建镜像

第三步:上传镜像
docker push 镜像名
上传镜像出现错误:denied: requested access to the resource is denied解决

参考:
https://blog.csdn.net/wzygis/article/details/78205867
https://blog.csdn.net/shoneworn/article/details/80622268

制作并保存镜像/容器到本地

1.save方式保存镜像/容器到本地文件
docker save -o 新文件名  镜像/容器ID
save命令载入镜像文件
docker load < 文件名

此时输入:docker images会发现多了个镜像
详细参考:https://www.cnblogs.com/lsgxeva/p/8746644.html

2.export方式保存容器到本地文件
docker export -o xxx.tar 容器ID
import命令载入docker镜像文件
docker import xxx.tar 新镜像名

这两者区别可以参考下面链接:
https://my.oschina.net/zjzhai/blog/225112
https://blog.csdn.net/liukuan73/article/details/78089138
(前者文件大,后者文件小;前者偏向制作镜像,后者偏向快照;前者可以回滚,后者不能)

docker镜像下载地址

官方

https://hub.docker.com/search?image_filter=official&type=image

国内

阿里云镜像:https://promotion.aliyun.com/ntms/act/kubernetes.html
网易云镜像:https://c.163yun.com/hub#/m/home/
daoclub镜像:https://hub.daocloud.io/

docker可视化工具kitematic

就是一个能够操作docker的界面程序,如果上面的内容你大致都懂了的话,那这个怎么用你应该也自然就懂啦

容器常见问题

OSError: [Errno 8] Exec format error

https://blog.csdn.net/weixin_30393907/article/details/98291833

中文乱码
永久改变

通过DockerFile重新配置镜像,在里面加上一句环境配置:

ENV LANG C.UTF-8
临时改变(重启失效)

输入命令:

export LANG=C.UTF-8
安装vim
apt-get update
apt-get install vim
安装ping和ifconfig
apt-get update 
apt install net-tools # ifconfig 
apt install iputils-ping # ping
ssh连接失败导致无法使用

执行下列命令:

docker-machine -D ssh default

参考:https://stackoverflow.com/questions/34641003/error-checking-tls-connection-error-checking-and-or-regenerating-the-certs

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354