Tatsächlich ist Docker in einer solchen Ära des Cloud Computing seit langem bekannt und hat die Welt verändert Herkömmliche physische Maschinen Die Virtualisierungsmethode nutzt die Maschinenressourcen effizient aus, da die in Docker ausgeführten Anwendungen tatsächlich auf dem Host ausgeführt werden und daher keine Virtualisierung auf Hardwareebene erforderlich sind Anwendungscode, Speichernutzung und Dateilesegeschwindigkeit sind besser als bei herkömmlichen Virtualisierungsmethoden. Darüber hinaus ist die Startgeschwindigkeit oft im Millisekundenbereich, was die Entwicklungs-, Test- und Bereitstellungszeit erheblich verkürzen kann Für Entwickler besteht die größere Bedeutung von Docker darin, eine konsistente Betriebsumgebung sicherzustellen. Wenn die Entwicklungs-, Test- und Bereitstellungsumgebungen inkonsistent sind, treten häufig unerklärliche Fehler auf wie „Dieser Code funktioniert auf meinem Computer gut“, das ist einer der Gründe, warum wir Docker lernen sollten
Das Internet ist voll von Tutorials und Informationen zu verschiedenen Aspekten von Docker. Aufgrund der schnellen Entwicklung von Docker sind viele Tutorials für Anfänger tatsächlich veraltet. Es ist schwierig, sie zu unterscheiden und zu verstehen Eine Reihe von Fallstricken und Problemen, die die Motivation der Lernenden allmählich untergraben. Tatsächlich besteht der beste Weg, eine neue Technologie zu erlernen, darin, mit der offiziellen Dokumentation zu beginnen und sie dann mit GitHub zu erkunden Wenn Sie eine neue Technologie erlernen, können Sie viele Umwege vermeiden, wenn ich die Möglichkeit dazu habe.
Dieser Artikel ist durch die Länge und das Niveau des Autors begrenzt und wird nicht auf die zugrunde liegenden Prinzipien und die technische Implementierung von Docker eingehen Ich werde Ihnen beibringen, wie man eine mühsame Docker-Datei schreibt, aber ich werde als gewöhnlicher Entwickler beginnen und Sie dazu bringen, eine Docker-basierte Laravel-Anwendung von Grund auf zu erstellen. Unsere Systemumgebung verwendet Ubuntu17.04, und andere Systeme sind natürlich ähnlich Bei Windows kann es anders sein.
Die Installation von Docker unter Ubuntu ist die gleiche wie bei normaler Software Aufgrund der chinesischen Besonderheiten sind jedoch viele Punkte zu beachten, die später ausführlich erläutert werden. Es wird empfohlen, das offizielle Ein-Klick-Installationsskript zu verwenden, um eine Reihe von Problemen zu vermeiden langwierige Operationen.
<span style="font-size: 14px;"> curl -fsSL get.docker.com -o get-docker.sh<br></span>
herunter, installieren Sie es und wählen Sie den Download von der Ali-Spiegelquelle:
<span style="font-size: 14px;">sudo sh get-docker.sh --mirror Aliyun<br></span>
Tatsächlich kann es grundsätzlich nach der Installation verwendet werden, hauptsächlich zur Konfiguration einiger Spiegelquellen und Benutzergruppen. Über den Zweck der Konfiguration der Spiegelquelle gibt es nicht viel zu sagen. Die Benutzergruppe dient hauptsächlich dazu, sie ohne Verwendung von Superadministratorrechten auszuführen.
Benutzergruppe beitreten
<span style="font-size: 14px;">sudo usermod -aG docker $USER<br></span>
PS. Es ist möglich, dass immer noch eine Meldung angezeigt wird, dass keine Berechtigung vorliegt. Starten Sie zu diesem Zeitpunkt den Computer neu
Konfigurieren Sie die Spiegelquelle
<span style="font-size: 14px;">sudo mkdir -p /etc/docker<br>sudo tee /etc/docker/daemon.json <<-'EOF'<br/>{<br/> "registry-mirrors": ["https://be62qq2e.mirror.aliyuncs.com"]<br/>}<br/>EOF<br/></span>
PS: Die Bildquelle hier stammt aus meiner eigenen Alibaba Cloud. Studenten können zur Alibaba Cloud gehen, um die proprietäre Bildquellenadresse zu erhalten
Neustart
<span style="font-size: 14px;">sudo systemctl daemon-reload<br/>sudo systemctl restart docker<br/></span>
Docker -compose ähnelt einem Paketverwaltungstool, das uns die Verwaltung von Bildern erleichtert.
<span style="font-size: 14px;">curl -L https://github.com/docker/compose/releases/download/1.17.1/run.sh > /usr/local/bin/docker-compose<br>chmod +x /usr/local/bin/docker-compose<br></span>
Docker hat zwei sehr wichtige Grundkonzepte: Bilder und Container. Diese beiden ähneln tatsächlich orientierten Klassen und Instanzen in Objekten werden zu einem Container, und dann kann der Container gestartet und gestoppt werden. Die von der im Container ausgeführten Anwendungen können tatsächlich beibehalten werden, solange der Container nicht zerstört wird wird zerstört Oder die Daten sind nach der Neuerstellung des Containers natürlich nicht mehr vorhanden, daher lautet die offizielle Empfehlung, die Bereitstellung für die Persistenz zu verwenden, was als nächstes besprochen wird
docker-compose 可以说是真正的让 Docker 现代化了. 它就类似于 PHP 的 Composer 包管理工具一样, 是用来管理多个镜像的. 它极大的降低了学习 Docker 的难度. 我们在日常的开发中, 经常会碰到需要多个容器相互配合来完成某项任务的情况,比如 Web 容器和数据库容器之间的通信,我们可以单独的把一个项目中需要的所有容器和配置写到一个 docker-compose.yml 文件中,来统一管理.来看一下一个简单的配置文件格式:
<span style="font-size: 14px;">version: '3'<br>services:<br> nginx:<br> build: .<br> ports:<br> - "80:80"<br><br> redis:<br> image: "redis:alpine"<br></span>
一个项目可以由多个服务(容器)工程,而 docker-compose 是面向项目进行管理.
这是 Docker 比较复杂的一块,简单介绍一下. Docker 里面的文件系统其实很真实宿主机的一样, 可以用同样的命令去操作, 只是要注意的一点就是我们在容器中运行的应用配置文件的路径全部都是基于 Docker 的,不是基于宿主机的,很多文件不存在的问题都是这个引起来的.比如我们在运行一个 Nginx 容器和 PHP-FPM 容器的时候,不仅要把宿主机的项目路径映射到 Nginx 容器中,还要映射到 PHP-FPM 容器中,否则就会是一系列的 File not found.
Docker 中的网络是有多种模式的, 在默认情况下是会创建一个虚拟网桥的, 实际上是 Linux 的一个 bridge,它会在挂载到它的网口之间进行转发。并且会随机分配一个本地未被使用的属于 172.17.0.0/16 网段的 IP 到各个容器中.这是一个网络拓扑图:
基本介绍后我们会通过一个简单的实例来加深理解, 就是部署一个 Laravel 应用. Web 服务器我们会使用 Nginx, 并且通过 PHP-FPM 来处理动态请求,用 MySQL 来存储数据, Redis 作为我们的缓存和队列驱动. 不同于网上的通过 Supervisor 来把所有服务运行在同一个容器中,我们会把这四个服务运行在四个容器中,这也是官方推荐的一种做法,然后我们会通过 docker-compose 来管理所有的服务(容器).
直接上配置文件:
<span style="font-size: 14px;">version: '2'<br>services:<br> nginx:<br> image: nginx<br> ports:<br> - "8090:80"<br> links:<br> - php-fpm<br> volumes:<br> - ./nginx/www:/var/www/html<br> - ./nginx/sites:/etc/nginx/sites-enabled<br> - ./nginx/nginx.conf:/etc/nginx/nginx.conf<br> command: [nginx-debug, '-g', 'daemon off;']<br></span>
其中的 services 节点下每一个表示一个服务;然后 nginx 这是个服务名可以随便取;image 指定使用哪个镜像来构建; ports 表示要暴露的端口,其中 8090 是指宿主机的端口,80 是指容器中的端口;volumes 表示挂载的目录和文件,我们这里挂载了代码目录,虚拟主机目录以及配置文件;command 表示容器启动后要运行的命令。我们还要在当前目录下创建一个 nginx 的目录,用来存放一系列的文件,还需要把配置文件新建并且写入配置内容(具体配置内容可以去官网查看,这里不说明),最后的目录结构是这样
<span style="font-size: 14px;">Docker<br> - docker-compose.yml<br> - nginx<br> - www<br> - sites<br> - nginx.conf<br></span>
可以把日志一起挂载,这里没有表述出来
然后执行启动容器的命令:
<span style="font-size: 14px;">docker-compose up nginx<br></span>
以上不会在后台启动,而是会直接在当前的 shell 上,然后我们访问应该就可以看到 Welcome to nginx!
同理我们再次配置 PHP-FPM,MySQL 以及 Redis 的容器了,具体过程不多讲,这里贴出配置:
<span style="font-size: 14px;"> php-fpm:<br> image: 'bitnami/php-fpm:7.1'<br> volumes:<br> - ./nginx/www:/var/www/html<br> - ./php-fpm/php.ini:/bitnami/php/conf/php.ini<br> links:<br> - mysql<br> - redis<br><br> mysql:<br> image: mysql<br> restart: always<br> environment:<br> MYSQL_ROOT_PASSWORD: example<br> volumes:<br> - /var/lib/mysql:/var/lib/mysql<br><br> redis:<br> image: redis<br></span>
有一点要注意的是,在配置PHP-FPM容器的时候是需要把代码目录也挂载到容器里面的,这一点很容易被遗忘,网上很多教程都没提到,导致最后虽然按照步骤走了但就是跑不起来。其中的 links 就是配置要连接到哪个容器中。比如配置了 Nginx 容器连接到 PHP-FPM 的容器,这样我们在 Nginx 的容器中就可以直接 ping php-fpm,在配置的时候也可以这样 php-fpm:9000 来配置了。
Nginx 的配置文件,然后还要修改一下本地的 hosts 文件。
<span style="font-size: 14px;">server {<br> listen 80;<br> listen [::]:80;<br> root /var/www/html/laravel/public;<br> index index.html index.php;<br> server_name laravel-docker.app;<br> location / {<br> try_files $uri $uri/ /index.php?$query_string;<br> }<br> location ~ \.php$ {<br> fastcgi_split_path_info ^(.+\.php)(/.+)$;<br> fastcgi_pass php-fpm:9000;<br> fastcgi_index index.php;<br> include fastcgi_params;<br> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;<br> }<br>}<br></span>