docker系列(1) 基本概念,常用命令及安装部署

1.docker

1.1 概念

docker三要素:

镜像(image):类似于Java中的类
容器(Container):类似于Java中的对象/实例
仓库(Repository):
docker三要素.png

1.1.1镜像

docker镜像.png

1.1.2容器

docker容器.png

1.1.3仓库

docker仓库.png

docker原理

docker原理.png

docker联合文件系统

图片.png

例如要docker pull tomcat
则可能会拉下kernel, centos, jdk, tomcat等

好处是: 共享资源
而若有多个镜像从相同的base镜像构建而来, 则宿主机只需在磁盘上保存一份base镜像
同时内存中也只加载一份base镜像, 就可以为所有容器服务了, 而且每一层镜像都可以被共享
图片.png

docker镜像加载原理

图片.png

1.1.4docker容器数据卷

是什么

docker容器产生的数据, 如果不通过docker commit生成新的镜像, 
使得数据作为容器的一部分保存下来, 那么当容器删除后, 数据便没了

因此, 为了能保存数据在docker中, 使数据持久化, 我们使用卷.
卷就是目录或文件, 存在于一个或多个容器中, 由docker挂载到容器,
但不属于文件联合系统, 因此能绕过文件联合系统, 提供一些用于持久存储或共享数据的特性

能干什么

卷的设计目的就是数据的持久化, 完全独立于容器的生命周期, 
因此docker不会在容器删除时, 删除其挂载的数据卷

特点:
1.数据卷可以在容器间共享或重用数据
2.卷中更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止

简言之:
1.容器的持久化
2.容器间继承 + 数据共享(与宿主机共享等)

如何用

#方法1: 命令行的方式进行交互
"docker run -it -v /宿主机绝对路径目录:/容器内绝对路径目录 镜像名"
#查看docker容器卷与宿主机之间的绑定关系
"docker inspect 容器ID"
#若是仅仅希望, 容器内挂载路径是只读的, 仅有宿主机可以单向修改,则:
"docker run -it -v /宿主机绝对路径目录:/容器内绝对路径目录:ro 镜像名"
#方法2: dockerfile的方式

数据卷容器: --volumes-from

命名的容器挂载数据卷, 其他容器通过挂载这个(父容器)实现数据共享, 
--->挂载数据卷的容器, 称为数据卷容器

"docker run -it --name d1 tomcat"
"docker run -it --name d2 --volumes-from d1 tomcat"

#类似于继承关系, d2继承d1, d1创建的文件, d2中也有, 反之亦然
#容器间配置信息的传递, 数据卷生命周期一直到没有容器使用它为止

2.安装docker

2.1 CentOS7下安装docker

2.1.1 安装 docker

查看系统的版本和内核

"
cat /etc/issue
uname -r
"
#docker要求服务CentOS6以上且是64位,kernel 版本必须2.6.32-431或更高可以
执行:"yum update" 升级内核,不然后边启动docker是会报错

安装epel

yum install -y epel-release

安装docker

yum install docker-io -y

docker加入开机启动项

chkconfig docker on

启动docker

service docker start

查看docker版本

docker version

查看docker更多信息

docker info (如果此处报错,那么可能是centos内核版本问题,可以升级内核)

下载docker镜像

docker pull centos:latest (这里的latest是centos的版本,可以直接改为版本号如centos:6.5)

查看镜像

docker images (查看所有镜像)

配置阿里云镜像加速器
已有淘宝账号,可以直接搜索https://cr.console.aliyun.com/cn-hangzhou/mirrors,登录后选择

aliyun镜像加速.png

CentOS的配置方式略微复杂,需要先将默认的配置文件复制出来
/lib/systemd/system/docker.service -> /etc/systemd/system/docker.service
然后再将加速器地址添加到配置文件的启动命令
重启Docker就可以了。见下述:
sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
sudo sed -i "s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=<your accelerate address>|g" /etc/systemd/system/docker.service
sudo sed -i "s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd --registry-mirror=<your accelerate address>|g" /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo service docker restart

2.1.2 安装 docker-compose

#1.离线下载
https://github.com/docker/compose/releases
下载 docker-compose-Linux-x86_64
#2.上传到 linux, 
下载后, root用户下, 上传到 /usr/local/bin/ 目录下.
将 docker-compose-Linux-x86_64 重命名为 docker-compose.
#3.添加可执行权限
chmod +x /usr/local/bin/docker-compose
#4.查看docker-compose版本
docker-compose -v

2.2 win10下安装docker

下载地址(镜像)
https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe

双击即可自动安装

可能的问题

需要开启Hyper-V虚拟机(BIOS进入后, 启动支持Hyper-V, 然后进入系统后设置即可)

设置基本信息

存储位置.png

镜像加速.png

国内镜像加速地址

#docker中国(好像挂了?)
https://registry.docker-cn.com
#阿里云
上述centos版已叙述获取方式
#网易:
http://hub-mirror.c.163.com
#其他:
https://docker.mirrors.ustc.edu.cn

3.docker常用命令

3.1 帮助命令

查询docker常用命令:   
docker --help

3.2 镜像命令

#查看已有镜像
docker images  查看已有镜像
docker images -a  查看本地所有镜像(含中间层镜像)
docker images -q  只显示镜像ID
docker iamges -qa  查看本地所有镜像ID
docker iamges --digests  显示镜像的摘要信息
docker iamges --no-trunc  不截取镜像信息,完整信息信息

#docker search xxx从dockerhub中搜索镜像, 如:docker search tomcat
docker search -s 30 tomcat  点赞数超过30的tomcat
docker search --no-trunc tomcat  显示完整的镜像描述

#下载镜像
docker pull tomcat  默认下载最新版
docker pull tomcat:7.0.47  下载指定版本

#删除镜像
docker rmi hello-world  删除该镜像
docker rmi -f hello-world   强制删除该镜像,无论其是否运行
docker rmi -f a b c     强制删除a,b,c镜像
docker rmi -f $(docker images -qa)  删除本地所有docker 镜像

#根据运行中的容器生成镜像
#提交容器副本, 使之成为一个新的镜像
docker commit
#具体命令
docker commit -m="提交的描述信息"  -a="作者"  容器ID  要创建的目标镜像名:[标签名]
docker-images结果说明.png

3.3 容器命令

#新建并启动容器
docker run [options] image [command] [args...]

#列出当前所有正在运行的容器
docker ps [options]
docker ps -l  (上一次运行的容器)
docker ps -n 3   (上3次运行的容器)

#退出容器
方法1: exit  (容器停止,并退出)
方法2: ctrl+p+q  (容器不停止,退出)

#启动容器
docker start [容器ID或者容器名]

#重启容器
docker restart [容器ID或者容器名]

#停止容器
docker stop [容器ID或者容器名]

#停止所有的container
docker stop $(docker ps -a -q)

#强制停止容器
docker kill [容器ID或者容器名]

#删除已停止的容器
docker rm [容器ID或者容器名]
docker rm -f [容器ID或者容器名](强制删除容器)
docker rm -f $(docker ps -qa)(删除所有容器)

#查看容器日志
docker logs -f -t --tail [容器ID]
#其中-f是跟随最新的日志打印,-t是加入时间戳,--tail跟随数字,显示最后多少条

#查看容器内运行的进程
docker top [容器ID]

#从容器内拷贝文件到主机上
docker cp 容器ID:容器内的路径 目的主机路径

#查看docker容器卷与宿主机之间的绑定关系
docker inspect 容器ID

#进入某个容器内部
docker attach 容器ID

4.Docker的图形化管理工具Portainer

#下载镜像
sudo docker pull docker.io/portainer/portainer

#启动镜像
sudo docker run -d -p 9000:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --name portainer  docker.io/portainer/portainer

#输入url访问(首次登录需要设置密码, 比如: 12345678)
http://ip:9000

#若是报错, 则
>>  编辑 vi /etc/docker/daemon.json
{
  "hosts": ["tcp://192.168.0.156:2375", "unix:///var/run/docker.sock"]
}
>> 重启 systemctl restart docker (切记2375的tcp端口要设置允许访问)
Portainer.png
docker-porainer.png

5.docker下安装gitlab

5.1拉取gitlab镜像

docker pull gitlab/gitlab-ce

5.2运行容器

docker run --detach --hostname 192.168.0.199 --publish 8443:443 --publish 8888:80 --publish 8222:22 --name gitlab --restart unless-stopped --volume /srv/gitlab/config:/etc/gitlab --volume /srv/gitlab/logs:/var/log/gitlab --volume /srv/gitlab/data:/var/opt/gitlab --privileged=true gitlab/gitlab-ce:latest

参数说明

--hostname 192.168.0.199: 指定容器中绑定的域名,会在创建镜像仓库的时候使用到,这里绑定ip
--publish 8443:443:将http:443映射到外部端口8443
--publish 8888:80:将web:80映射到外部端口8888
--publish 8222:22:将ssh:22映射到外部端口8222
--name gitlab 运行容器名
--restart unless-stopped 重启策略
--volume /srv/gitlab/config:/etc/gitlab 配置文件挂载目录
--volume /srv/gitlab/logs:/var/log/gitlab 日志挂载目录
--volume /srv/gitlab/data:/var/opt/gitlab 数据挂载目录
--privileged=true 使得容器内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限

5.3访问:

稍等片刻,初始化完毕,再打开浏览器:http://192.168.0.199:8888
修改最高权限root密码(最少8位)即可

图片.png

然后使用 用户名root,密码为12345678进行登陆。

>>>>>>>>> 常见问题 <<<<<<<<<

若是安装后一直报502错误,看了GitLab全局日志,说什么DNS没设置, 但均无解.
查阅资料显示GitLab对系统硬件有要求,主要就是内存大于2G,否则或碰到奇怪的错误,
使用Top命令查看交换空间(类Windows的虚拟内存),没有默认设置,
自行Centos7 设置交换空间SWAP方法如下:
#查看Swap交换空间大小,如果是0,往下看
free -h

#操作  需要  root 用户 权限
#dd 命令 创建swap用的分区文件 /var/swap
#分区大小设为2g
dd if=/dev/zero of=/var/swap bs=1024 count=2048000
mkswap /var/swap
#将文件变成swap分区
mkswap -f /var/swap
#开启swap
swapon /var/swap
#ore /proc/swaps

#接下来设置为开机自启动
#编辑自启动文件配置
vi /etc/fstab 
#添加如下行
/var/swap           swap                    swap     defaults     0     0
#保存退出

题外话 Swap 交换空间:

SWAP就是LINUX下的[虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间(也就是SWAP分区虚拟成内存来使用.
需要注意的是,虽然这个SWAP分区能够作为"虚拟"的内存,但它的速度比物理内存可是慢多了,
因此如果您需要更快的速度的话,并不能寄厚望于SWAP,
最好的办法仍然是加大物理内存.SWAP分区只是临时的解决办法.

https://about.gitlab.com/install/#centos-7
https://my.oschina.net/langwanghuangshifu/blog/2907043
https://blog.csdn.net/nanxiaotao/article/details/80617653
https://hub.docker.com/r/beginor/gitlab-ce/

6.安装器软件

6.1 安装mysql5.7

docker pull mysql:5.7
docker run --name mysql_server -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

7.常见问题

7.1 Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

vi /etc/dockerdaemon.json
#ip为本机ip, 2375端口一定要开
{
  "hosts": ["tcp://192.168.1.155:2375", "unix:///var/run/docker.sock"]
}

:wq保存后, 重新docker
systemctl restart docker.service

7.2 开启 docker 挂载权限

#开启docker挂载权限
chmod a+rw /var/run/docker.sock

7.3 如果部署后docker ps发现进程已经启动,但外部无法访问,且type是Ipv6

1.当主机拥有多于一块的网卡时,其中一块收到数据包,
根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。
这通常是路由器所要实现的功能; 查看一下:
/sbin/sysctl net.ipv4.ip_forward

如果 net.ipv4.ip_forward = 0
说明转发没有打开

2.永久修改 net.ipv4.ip_forward
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1

3.保存后,sysctl -p 重启生效即可

参考资源

https://www.kubernetes.org.cn/5883.html (Portainer安装使用)
https://blog.51cto.com/bovin/2170723 (Portainer安装使用)
https://www.cnblogs.com/zhengqing/p/11174011.html (docker安装mysql5.7)

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