前言
      
       Docker是什么?
      
     
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。比如,你在本地用Python开发网站后台,开发测试完成后,就可以将Python3及其依赖包、Flask及其各种插件、Mysql、Nginx等打包到一个容器中,然后部署到任意你想部署到的环境。
      
       Portainer是什么?
      
     
Portainer是一个可视化的容器镜像的图形管理工具,利用Portainer可以轻松构建,管理和维护Docker环境。而且完全免费,基于容器化的安装方式,方便高效部署。官方站点:https://www.portainer.io/
      
       一、安装:
      
     
      
       1.1创建数据卷:
      
     
docker volume create portainer_data
      
       1.2首次运行容器:
      
     
docker run -d --restart=always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --name=portainer portainer/portainer这样一来,就可以通过访问宿主机的9000端口来访问portainer了。
运行参数信息:
-d:容器在后台运行;
-p 80:9000 :宿主机80端口映射容器中的9000端口,前一个80是宿主机端口,后一个9000是docker内部应用端口
-v /var/run/docker.sock:/var/run/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中;
-v portainer_data:/data :把宿主机portainer_data数据卷挂载到容器/data目录下,以”:”分隔
–name=portainer:指定运行portainer容器的名称为portainer,以后再次运行时只需通过docker run portainer来运行了
–restart=always: 实现容器在宿主机开机时自启动
–privileged:映射文件最高权限,可以进行读写操作
      
       1.3再次运行
      
     
依照1.2中的例子,因为已经执行容器的名称为portainer,次运行时只需通过docker run portainer来运行。
运行截图:
       
     
       
     
       
     
       
     
      
       二、部署其它容器
      
     
      
       2.1运行Tomcat8.5
      
     
拉取镜像:
docker pull tomcat:8.5.56
      
       2.2.1首次运行
      
     
docker run -d --restart=always --name=tomcat8.5.56 -p 8080:8080 \ -v /media/docker/tomcat/webapps:/usr/local/tomcat/webapps \ -v /media/docker/tomcat/logs:/usr/local/tomcat/logs \-d tomcat:8.5.56注意:为便于程序部署和查看日志,将用于存放部署应用的目录/usr/local/tomcat/webapps和用于存放Tomcat日志的目录/usr/local/tomcat/logs都挂载到本地路径了,分别是:/media/Data/docker/tomcat/webapps和/media/Data/docker/tomcat/logs,这样即使容器被删除,数据依然存在。
      
       2.2.2再次运行
      
     
docker run tomcat
      
       2.2运行MySQL5.7
      
     
创建目录:
mkdir -p /media/docker/mysql/data拉取镜像:
docker pull mysql:5.7
      
       2.2.1首次运行
      
     
docker run -d --restart=always -p 3306:3306 \ -v /media/ai/Data1/docker/mysql/conf/my.cnf:/etc/my.cnf \ -v /media/ai/Data1/docker/mysql/data:/var/lib/mysql  \-e MYSQL_ROOT_PASSWORD=123456 --name=mysql mysql:5.7注意:将外部配置文件/media/Data/docker/mysql/conf/my.cnf映射为内部MySQL使用的配置文件/etc/my.cnf,将数据存放路径/media/Data/docker/mysql/data映射为MySQL数据存放路径/var/lib/mysql,同时通过-e MYSQL_ROOT_PASSWORD=123456指定管理员面,同时还通过–name=mysql指定容器名称
附:
在MySQL中为单用户指定某个库所有权限的SQL语句示例:
GRANT ALL ON gitea.* TO 'gitea'@'%' IDENTIFIED BY 'gitea@2020';  FLUSH PRIVILEGES;GRANT ALL ON gogs.* TO 'gogs'@'%' IDENTIFIED BY 'gogs@2020';  FLUSH PRIVILEGES;在MySQL5.7中更改MySQL中root账户权限的SQL语句示例:
update user set authentication_string=password('Root@123$') where user='root';
      
       2.2.2再次运行
      
     
docker run mysql
      
       2.3运行FTP
      
     
      
       2.3.1首次运行
      
     
创建FTP目录用于存放FTP数据:
mkdir /media/ai/vmraid1/sambamkdir /var/log/vsftpd运行vsftp的Docker容器:
docker run -d --restart=always -v /media/ai/vmraid1/samba:/home/vsftpd -v /var/log/vsftpd/:/var/log/vsftpd/ -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=ftpuser -e FTP_PASS=ftpuser -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 -e PASV_ADDRESS=192.168.0.2 -e LOG_STDOUT=1 --name vsftpd fauria/vsftpd备注:指定默认账户为ftpuser,初始密码为:ftpuser。
进入容器(通过容器名vsftpd进入):
docker exec -it vsftpd /bin/bash查看vsftp账户:
cat /etc/vsftpd/virtual_users.txt向vsftp中添加新账户(账号为zhoujinqiao,密码为zhou123456):
echo "zhoujinqiao" >>/etc/vsftpd/virtual_users.txtecho "zhou123456" >>/etc/vsftpd/virtual_users.txt生成二进制文件:
db_load -T -t hash -f /etc/vsftpd/virtual_users.txt /etc/vsftpd/virtual_users.db重启容器(需要在宿主机运行)
docker restart vsftpd
      
       2.3.2再次运行
      
     
docker start vsftpd
      
       2.4运行gitea
      
     
Gitea是一个由开源社区驱动的轻量级的代码托管解决方案,后端采用Go语言编写,采用MIT许可证协议。使用Gitea可以搭建一个自己托管的Git服务程序,与Github、Bitbucket和Gitlab比较类似,但更加轻量。Gitea是2016年11月从Gogs发展出来,并且做了很多改进,目标就是创建一个极易安装、运行快速、体验良好的自建Git服务。目前在Github上有16.9k个Star、1.9k个fork,657个贡献者,社区活力非常强劲,并且云原生下的Jenkins X也在支持Gitea,相信在不远的未来,一定能成为一款成熟的云原生下的Git服务平台。
      
       2.4.1拉取
      
     
docker pull gitea/gitea:latest
      
       2.4.2创建外部挂载目录
      
     
mkdir -p /media/Data/docker/gitea/data
      
       2.4.3首次运行
      
     
在运行之前先创建MySQL数据库,可以在本文档中运行的Docker示例中创建MySQL数据库,数据库和用户名分别为:gitea和gitea@2020,授权语句如下:
GRANT ALL ON gitea.* TO 'gitea'@'%' IDENTIFIED BY 'gitea@2020';  FLUSH PRIVILEGES;然后再运行如下命令,启动容器:
docker run -d --name gitea --restart=always  -p 2222:22 -p 20080:3000 -v /media/Data/docker/gitea/data:/data gitea/gitea:latest注意:将外部目录/media/Data/docker/gitea/data挂载为docker的/data目录。
      
       2.4.4再次运行
      
     
docker run gitea
      
       2.5运行Samba
      
     
      
       2.5.1准备工作
      
     
查找镜像:
docker search samba采用下载次数最多的镜像dperson/samba
拉取镜像:
docker pull  dperson/samba在本地创建个目录,以便于容器挂载
mkdir -p sudo mkdir -p /media/ai/vmraid/samba #创建samba共享根目录chmod -R 777 /media/ai/vmraid/samba  //修改根目录权限,不修改的话连接进去会提示没有权限写入数据
      
       2.5.2初次运行
      
     
docker run -d --name samba --restart=always \  -p 139:139 -p 445:445 \  -v /media/ai/vmraid1/samba:/mount  \  -d dperson/samba:latest -u "admin;admin" \  -s "samba;/mount/;yes;no;no;all;no;all;share on server"注:-u “admin:admin” 连接时的账号和密码
-s “[;browse;readonly;guest;users;admins;writelist;comment]”
Configure a share
required arg:
“;”
is how it’s called for clients
path to share
NOTE: for the default values, just leave blank
[browsable] default:’yes’ or ‘no’
[readonly] default:’yes’ or ‘no’
[guest] allowed default:’yes’ or ‘no’
NOTE: for user lists below, usernames are separated by ‘,’
[users] allowed default:’all’ or list of allowed users
[admins] allowed default:’none’ or list of admin users
[writelist] list of users that can write to a RO share
[comment] description of share
如果上述操作还不行,可以进入到容器内部修改samba的配置文件/etc/samba/smb.conf,添加如下内容:
[share]comment = samba with web static serverpath = /mount/browseable = yeswritable = yesavailable = yesadmin users = adminvalid users = adminpublic = yes完整的smb.conf文件内容如下:
[global]   workgroup = MYGROUP   server string = Samba Server   server role = standalone server   log file = /dev/stdout# Put a capping on the size of the log files (in Kb).   max log size = 50# via DNS nslookups. The default is NO.   dns proxy = no   pam password change = yes   map to guest = bad user   usershare allow guests = yes   create mask = 0664   force create mode = 0664   directory mask = 0775   force directory mode = 0775   force user = smbuser   force group = smb   follow symlinks = yes   load printers = no   printing = bsd   printcap name = /dev/null   disable spoolss = yes   strict locking = no   aio read size = 0   aio write size = 0   vfs objects = catia fruit recycle streams_xattr   recycle:keeptree = yes   recycle:maxsize = 0   recycle:repository = .deleted   recycle:versions = yes   # Security   client ipc max protocol = SMB3   client ipc min protocol = SMB2_10   client max protocol = SMB3   client min protocol = SMB2_10   server max protocol = SMB3   server min protocol = SMB2_10   # Time Machine   fruit:delete_empty_adfiles = yes   fruit:time machine = yes   fruit:veto_appledouble = no   fruit:wipe_intentionally_left_blank_rfork = yes[samba]   path = /mount/   browsable = yes   writable = yes   available = yes   read only = no   guest ok = no   veto files = /.apdisk/.DS_Store/.TemporaryItems/.Trashes/desktop.ini/ehthumbs.db/Network Trash Folder/Temporary Items/Thumbs.db/   delete veto files = yes   admin users = admin   valid users = admin   write list = all   comment = share on server可以将其存为容器外的smb.conf文件,然后在容器启动后拷贝到容器中去,假定容器外路径为/media/ai/Data1/docker/samba/smb.conf,其在容器内的位置固定为/etc/samba/,启动容器ID为361e27645867,那么执行下面的命令可以实现拷贝:
sudo docker cp /media/ai/Data1/docker/samba/smb.conf 361e27645867:/etc/samba/
      
       2.5.3再次运行
      
     
docker run samba
      
       三.其它事项
      
     
      
       3.1更换Docker的安装源为国内镜像
      
     
使用docker pull命令的时候默认是从docker官方源拉取,速度较慢,为提高速度,可通过下面的方式设置为国内镜像:
# 创建或修改 /etc/docker/daemon.json 文件,修改为如下形式
{    "registry-mirrors" : [    "https://registry.docker-cn.com",    "https://docker.mirrors.ustc.edu.cn",    "http://hub-mirror.c.163.com",    "https://cr.console.aliyun.com/"  ]}# 重启docker服务使配置生效
$ systemctl restart docker.service
      
       3.2更换源
      
     
docker容器中默认使用的源都是国外的(因为镜像的作者大多是国外的),如果需要再安装新的应用时需要更换国内镜像源,以Ubuntu16.04为例:
      
       3.2.1 Ubuntu16.04
      
     
#更换国内镜像(Ubuntu16.04)
mv /etc/apt/sources.list /etc/apt/sources.list.bakecho "deb http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse" >/etc/apt/sources.list && \echo "deb http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse" >>/etc/apt/sources.list  && \echo "deb http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.163.com/ubuntu/ xenial main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.163.com/ubuntu/ xenial-security main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.163.com/ubuntu/ xenial-updates main restricted universe multiverse">>/etc/apt/sources.list && \echo "deb-src http://mirrors.163.com/ubuntu/ xenial-proposed main restricted universe multiverse" >>/etc/apt/sources.list && \echo "deb-src http://mirrors.163.com/ubuntu/ xenial-backports main restricted universe multiverse" >>/etc/apt/sources.list#更新安装源
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 3B4FE6ACC0B21F32apt-get update
      
       3.2.2CentOS7
      
     
首先备份 CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak之后启用 TUNA 软件仓库, 将阿里云镜像仓库信息写入 /etc/yum.repos.d/CentOS-Base.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo清除缓存
yum clean all     # 清除系统所有的yum缓存yum makecache     # 生成yum缓存yum update
      
       3.3更改时区
      
     
默认情况下Docker容器的时区都是非东八区(北京时间),为了适应国内场景,需要更换国内时区,分别以Ubuntu16.04和CentOS为例。
      
       3.3.1Ubuntu16.04
      
     
进入容器,执行:
dpkg-reconfigure tzdata分别选择:
6 (Asia)70 (Chongqing)
      
       3.3.2CentOS7
      
     
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
      
       3.3安全设置
      
     
      
       3.3.1CentOS7
      
     
防火墙服务:
开启服务:systemctl start  firewalld.service停止服务:systemctl stop  firewalld.service重启服务:systemctl restart  firewalld.service查看状态:systemctl status firewalld.service启用服务:systemctl enable firewalld.service禁用服务:systemctl disable firewalld.service查看是否开机启动:systemctl  is-enabled  firewalld.service查看启用列表:systemctl list-unit-files|grep enabled查看失败列表:systemctl  --failed查看版本:firewall-cmd --version查看状态:firewall-cmd --state查看开放端口:firewall-cmd --zone=public --list-ports重新加载规则:firewall-cmd --reload查看区域信息:firewall-cmd --get-active-zones查看指定网卡区域信息:firewall-cmd --get-zone-of-interface=eth0禁用所有包:firewall-cmd --panic-on开启80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent查看80端口状态:firewall-cmd --zone=public --query-port=80/tcp删除80端口开放:firewall-cmd --zone=public --remove-port=80/tcp --permanent
      
       3.4CentOS7安装Docker
      
     
      
       3.4.1.查看是否安装过
      
     
whereis docker
      
       3.4.2.下载之前版本
      
     
sudo yum remove docker docker-common docker-selinux docker-engine
      
       3.4.3.安装所需软件包
      
     
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
      
       3.4.4.设置yum源
      
     
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      
       3.4.5.查看docker版本,使用稳定源
      
     
sudo yum list docker-ce --showduplicates | sort -r
      
       3.4.6.安装docker
      
     
默认安装最新版本
sudo yum install docker-ce -y安装某特定版本需增加版本号(如18.06.3.ce-3.el7)
sudo yum install docker-ce-18.06.3.ce -y
      
       3.4.7.启动docker
      
     
sudo systemctl start docker
      
       3.4.8.设置开机启动
      
     
sudo systemctl enable docker
      
       3.4.9.验证是否安装成功
      
     
docker version
      
       3.4.10.docker权限问题
      
     
首先创建docker用户组
sudo groupadd docker添加当前用户至docker用户组
sudo usermod -aG docker $USER更新用户组权限
newgrp docker
      
       3.5常用命令
      
     
      
       3.5.1查看容器信息
      
     
docker ps --format "table {{.ID}}\t{{.Status}}\t{{.Names}}"
      
       3.5.2查看容器网络信息
      
     
docker network ls
      
       3.5.3查看指定容器具体网络信息
      
     
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'  75000c343eb7其中” 75000c343eb7”为Container ID。
      
       3.5.4使用 docker run -v 启动的容器被删除以后,在主机上会遗留下来孤单的卷。查看Docker中所有的数据卷
      
     
docker volume ls
      
       3.5.5清理所有的孤立数据卷(即不再使用的)
      
     
docker volume ls -qf dangling=true
      
       3.5.6流出当前主机的网桥
      
     
brctl show类似的命令还有创建和删除网桥
删除网桥
sudo brctl delbr docker0创建网桥
sudo brctl addbr bridge0
      
       3.5.7当前当前主机网卡及IP
      
     
Ifconfig
      
       3.5.8开启宿主机IP转发功能(以下两条语句,随便一条均可):
      
     
sudo echo 1 > /proc/sys/net/ipv4/ip_forwardsudo sysctl -w net.ipv4.ip_forward=1
      
       3.5.9连接已经运行的Docker容器
      
     
docker exec -it ContainerId/ContainerName /bin/bashdocker attach [OPTIONS] CONTAINER
不建议使用docker attach,因为使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。
其中容器ID可以用docker ps –a来查询,下面就是一个例子:
docker exec -it 16835492fd2d /bin/bash
运行效果如下:
       
     
      
       3.5.10查看docker的磁盘使用情况
      
     
docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况:
$ docker system dfTYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLEImages          2         2         608.3MB   0B (0%)Containers      2         2         107.5kB   0B (0%)Local Volumes   1         1         136kB     0B (0%)Build Cache     0         0         0B        0B
      
       3.5.10清理空间
      
     
docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了……所以使用之前一定要想清楚吶。
执行docker system prune -a命令之后,Docker占用的磁盘空间减少了很多。
      
       3.5.11Docker容器与主机之间数据拷贝
      
     
docker cp :用于容器与主机之间的数据拷贝。
将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下。
docker cp /www/runoob 96f7f14e99ab:/www/将主机/www/runoob目录拷贝到容器96f7f14e99ab中,目录重命名为www。
docker cp /www/runoob 96f7f14e99ab:/www将容器96f7f14e99ab的/www目录拷贝到主机的/tmp目录中。
docker cp  96f7f14e99ab:/www /tmp/
      
       3.6创建自定义网络
      
     
docker network create --subnet=192.168.3.0/8 mynetwork创建了192.168.3.0网段,网段名为” mynetwork”,以后创建容器时使用这个网段就可以了。
用法示例:
创建目录:
mkdir -p /home/jerry/docker/tomcat/webapps /home/jerry/docker/tomcat/logs运行容器:
docker run --name=tomcat --net mynetwork --ip 192.168.3.2 -p 8080:8080 -v /home/jerry/docker/tomcat/webapps:/usr/local/tomcat/webapps -v /home/jerry/docker/tomcat/logs:/usr/local/tomcat/logs -d tomcat:8.5.11题外话:
虽然最近有新闻称新版的容器编排工具不再支持Docker了,但是作为小型组织和个人,在需要一个简单的环境时使用Docker还是不失为一个不错的选择,比如podman就比docker要复杂一些。至少我本人在今后一段时间内还会将Docker作为我个人和所在组织的容器工具。
 
