1.docker
1.1 概念
docker三要素:
镜像(image):类似于Java中的类
容器(Container):类似于Java中的对象/实例
仓库(Repository):
1.1.1镜像
1.1.2容器
1.1.3仓库
docker原理
docker联合文件系统
例如要docker pull tomcat
则可能会拉下kernel, centos, jdk, tomcat等
好处是: 共享资源
而若有多个镜像从相同的base镜像构建而来, 则宿主机只需在磁盘上保存一份base镜像
同时内存中也只加载一份base镜像, 就可以为所有容器服务了, 而且每一层镜像都可以被共享
docker镜像加载原理
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,登录后选择
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, 然后进入系统后设置即可)
设置基本信息
国内镜像加速地址
#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 要创建的目标镜像名:[标签名]
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端口要设置允许访问)
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位)即可
然后使用 用户名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)