前言
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 3B4FE6ACC0B21F32
apt-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/bash
docker 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作为我个人和所在组织的容器工具。