docker 无法启动 ftp_Docker及其图形化管理工具Portainer使用

  • Post author:
  • Post category:其他


前言


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来运行。

运行截图:

eb62e142b457778fcd18c3b6825f590d.png

410ba0599c501da12c1b9519f0ec4db0.png

3f9f39885db87435f567beccdeb2bde3.png

34d1f1c4d7f5b9e1752567d05afce67f.png


二、部署其它容器


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

运行效果如下:

08c94da95e484702193d2fd25f1c3c24.png


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作为我个人和所在组织的容器工具。



版权声明:本文为weixin_39861734原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。