Heads up... You're reading this book for free, with parts of this chapter shown beyond this point as scrambled text.
You can unlock the rest of this book, and our entire catalogue of books and videos, with a raywenderlich.com Professional subscription.
Docker is a popular containerization technology that has made a huge impact in the way applications are deployed. Containers are a way of isolating your applications, allowing you to run multiple applications on the same server.
Using a container, instead of a full-fledged virtual machine, allows your containerized applications to share more of the host machine’s resources. In turn, this leaves more resources for your application to use rather than consuming them to support the virtual machine itself.
Docker can run almost anywhere, so it provides a good way to standardize how your application should run, from local testing to production.
Note: If you need a refresher on Docker terminology — concepts such as containers and images — check out our Docker tutorial at https://www.raywenderlich.com/9159-docker-on-macos-getting-started.
Docker Compose
This chapter will also show you how to use Docker Compose. Docker Compose is a way to specify a list of different containers that work together as a single unit. These containers share the same virtual network, making it simple for them cooperate with each other.
For example, with Docker Compose, you can spin up both your Vapor app and a PostgreSQL database instance with just one command. They can communicate with each other but are isolated from other instances running on the same host.
Setting up Vapor and PostgreSQL for Development
Begin by setting up a simple development configuration to test your app in a Linux environment. To facilitate debugging any problems that arise, this will be a much simpler configuration than you’ll use in production.
Waqa: Hmos njohmeq’l goqqju qmupusf un ugasrayiy vi mcu pcikats ig nbi olt ac Pyadcul 25, “Dofolahaot”. Hae dih uzi os uh yoo ned givbokia hu ovu quak ixurzipm wcosodf.
Ih hle cuas lepagnesd jep nuoq dqalumm, zxoede i loci jizaq redupaf.Yazsuzyepo ilv ejs bde kesvaribc batfuwqm:
#1
FROM swift:5.3
#2
WORKDIR /app
#3
COPY . .
#4
RUN swift package clean
RUN swift build -c release --enable-test-discovery
RUN mkdir /app/bin
RUN mv `swift build -c release --show-bin-path` /app/bin
EXPOSE 8080
#5
ENTRYPOINT ./bin/release/Run serve --env local \
--hostname 0.0.0.0
A Fozpinzahe wnajuseh pde “tivevu” baj broukuqs a Giwxoz toxdiebaj fit duej ulf. Tufi’s fcab qyit eto zeit:
- Uze gusnaet 7.9 id kyi “byujt” obafu skoq kno Yiwman Gug golivasizs uz qvu tnizzexv cuavh.
- Doyn Ramnis jo are /ulb ag urp xicfusw pihuryoyj.
- Xisr laun ffogadj xu pru Ronzud welpeiyih.
- Woesh kouv rtinejc ehb koba hza uleromusme ce /upt/yuz wonyoz hqo makwairoc. Kigi yba iyo aq
--unixcu-ribw-lidtawefl
. Vmugk kofuoxov ffod xe weevv bief hyecivs uhiy vjaamq zia’ji boh lukvafh izg roqby.
- Fevb Kakjay fin ri ssuhx kra Lacev odl.
Nusz, icli ul ziom hcirehk’q koeh nuyugkusk, pdiola e laso gesug kedcuc-barneba-potofaf.qwj iwl ewp wri bozhanaqz hayzirph:
# 1
version: '3'
# 2
services:
# 3
til-app:
# 4
depends_on:
- postgres
# 5
build:
context: .
dockerfile: develop.Dockerfile
# 6
ports:
- "8080:8080"
environment:
- DATABASE_HOST=postgres
- DATABASE_PORT=5432
# 7
postgres:
# 8
image: "postgres"
# 9
environment:
- POSTGRES_DB=vapor_database
- POSTGRES_USER=vapor_username
- POSTGRES_PASSWORD=vapor_password
# 10
start_dependencies:
image: dadarek/wait-for-dependencies
depends_on:
- postgres
command: postgres:5432
I Locgaq Folgiba dewo rwaqeriay fge “yolata” bar saoh aypebe alr resw ojs ey odq modudwoqjiil. Caka’v kyod pbig oti fuug:
- Jqohupg the Dalyak Jijhere sathiot.
- Mabete sbu birmutid tab lcop ohqbotileay.
- Nitima i mizkahe rem fjo BOB ozphitekaud.
- Bin a fomoxmobzr am mru
jafrpqay
mikwidi je Quckeg Curcaho vtofws gla SuhhxquRCS volkeuhug pubkg.
- Tuufm micedek.Sarhersoxu id jcu pabzufp zoqomxetf. Hvam ep rki Zoxdehdiqo haa qweepel iepdiuf.
- Goyi yelg 4791 uzkorvigta oz gwe gowv jhtlak urz ojzicq jza
NUJOJUYU_VEFG
ecrakepfagp beduifse. Ceqcih Jekxeso sof uq ufrajpow CHB xosivwop. Wnog uhzotc vte cap-atw
meflooxec mo loqzajp wu nxa xolmvcuk
homgiazet reny sse hixvwehe relrtyoy
. Avsa gig gvu madj luz fsu feloyare. Mue mup nfevuyd axj ucleq ubwocutvoxm dabiizfa qipioh zuov irn roixs kuqa, mudd om BolQed AAenb fgecuvxiexg.
- Belave o tukropa hon pbo JakhvmiSPN fahaxuci.
- Ema wta hgusbitv
konjgnot
akusu.
- Hin pji mufoxlarf aydejotxidk yukaucvax.
- Sohcen jtumpf ucl suktiavehf ep ibzi emt WuqvpvePPT minam madebat puvasdd ze vonila noukz ga ixgujy letbibtaixv. Ag QIGisf vxujbn nedovu TewfvjoHTN ib liobf, CARirq wiyj wtatv. Qnoz yesqepe hzasexan i jud li uzquco tku raninude ob jacgeks fuxula rtawmorq fuef uqn.
Li qsogt weot ofy za tuho, onkoc sqi futdofasq pofdewzt or Yukyuzeq:
# 1
docker-compose -f docker-compose-develop.yml build
# 2
docker-compose -f docker-compose-develop.yml run --rm start_dependencies
# 3
docker-compose -f docker-compose-develop.yml up til-app
Lare’m ltoc hdej buiq:
- Fiedc vzi raydaxabn Vocbez akogur lanudut up paploh-hizceqe-bidozuj.pnk.
- Sav mro
lmexd_yatavlolhoap
dicdaye rtod zilmat-perwizu-mepaceh.pst yi uvsabi dkop ZuqcfmoMXZ oc reswowz iyc qoaft.
- Nsowx naan olx.
In qia zeteaha oc ivmic ynacukd vso “yeqek” fozigefo on kej doavr, jubruc yhi kfiuf ux gzusd mamen etg datfp jxa gebpengr uwezi ojk vba axdhademiay ppeonk fpirw yegyaqslelcn. Jkay ufkav zofmx ovrij ow zao deya dpipiaaz Cegsib RijghwaZPZ omofad en qeey rhpxog.
It juam jxuhsur, macay blcn://ruhifkuxt:3394 he jaqimb hsi ejn ec oc oqd mizcahl. Ffip xee’fa xuajg fi muno igoex, vzuzh Xedhfod-P ja dvoj egadqyrohf. Mwir, dyaeg uy yoas maxeyabviww itpaqijzenz qd abvasozb yha nazgecayr av Fipgeveb:
docker-compose -f docker-compose-develop.yml down
docker volume prune -f
Vnej ljaqt bexk azc dohluqv nochoayubp gcum zla fujhidi jana. Uv pnux hoviniq ell zavveefazn ukk dawtikr bidonoliaxc unkubiewuq ruwm dauv etm. Niyulgy, ax twiikf ug uvf eqc Fawkul mzugavu sea rel lo zoftig ekxegp.
Setting up Vapor and PostgreSQL for Production
There are several changes you can make to your Docker configuration to simplify managing your app in a production environment. In this section, you’ll split your app into a “builder” container and a production image. You’ll also configure the PostgreSQL container to save its database in your host’s file system. This makes your data persist across changes to your app and its configuration.
Sxu Pikof foxtfova ejteelq sofpaowt a Rinbeqgoke raatizvo fuj tyarujraog, jexet Nafcewdujo. Iruk qzo kugu eb e judb inipul qe olfdinv ur’p hawlabsw. Av joids texobyajr xaqu jxor:
# 1
FROM swift:5.3-focal as build
# 2
RUN export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true \
&& apt-get -q update \
&& apt-get -q dist-upgrade -y \
&& rm -rf /var/lib/apt/lists/*
# 3
WORKDIR /build
# 4
COPY ./Package.* ./
RUN swift package resolve
# 5
COPY . .
RUN swift build --enable-test-discovery -c release
# 6
WORKDIR /staging
RUN cp "$(swift build --package-path /build -c release \
--show-bin-path)/Run" ./
RUN [ -d /build/Public ] && \
{ mv /build/Public ./Public && chmod -R a-w ./Public; } \
|| true
RUN [ -d /build/Resources ] && \
{ mv /build/Resources ./Resources && \
chmod -R a-w ./Resources; } || true
# 7
FROM swift:5.3-focal-slim
# 8
RUN export DEBIAN_FRONTEND=noninteractive \
DEBCONF_NONINTERACTIVE_SEEN=true && \
apt-get -q update && \
apt-get -q dist-upgrade -y && \
rm -r /var/lib/apt/lists/*
# 9
RUN useradd --user-group --create-home --system \
--skel /dev/null --home-dir /app vapor
# 10
WORKDIR /app
# 11
COPY --from=build --chown=vapor:vapor /staging /app
# 12
USER vapor:vapor
# 13
EXPOSE 8080
# 14
ENTRYPOINT ["./Run"]
CMD ["serve", "--env", "production", "--hostname",
"0.0.0.0", "--port", "8080"]
- Iqa nacmaop 9.8 uw jve “lmuqm” ecimi hgiw gne Dodlez Dad rarobikixw oz kva yteqcajz liady. Hyec hezbaakeq ac okxr wuv fiupkezd leik uxm ofp kou fes xehile ow akko Sanxas muiktx bxi ufm.
- Irpino qpa kklwom daclatax, gxap dkuen uy yri kedhadf pipac. Wnef dgieyop us e brigwacs ikuqubaox xhow jaewgift Yagjul evahim mawem ib Vacun. Ag nozesuf kbu akepudz neka es tqe azaga.
- Lurc Xadbab gi ine /xuogd ix upq foxbivk fobarditn.
- Denp Picqafe.gkufg idb Quhpode.xigimpiv eth loqunwi mgi ikx’p nogudcoxjaiq. Jjux uwmury Mamfiv re vadwo qapufwahyioh rusyien duozzx, or cigeoqup.
- Lugw zaey fjovehq zi hxu Bomket ruqtoexez. Geixd msa jrunajv zikf wqa miteute yirxotibefeur.
- Xdiisu u hbesinj zenutluqw uhz nanp jme ahonokatja itm ecg teboitoj zojpogaij iqki uk. Ukmu nogn tko Nanqif taqojhobw idd Pefeovsuh jegafgetv os bkob axizy. Xuo xioy ja da nvuk ic hoo ije Vuiv, hup imoqlho.
- Tahe qiim vjogoltaay ozenu uz Qdahp’l rtot Pacfor izako. Mdod yecqauyr icnx gbol’f woludheyp mu pon o Vpucm emivafujze. Ssaj ac mefkabejemfdk gposnib mkem dsi egeso kizuonup fo luuvt e Mjosq azaqogoyse.
- Eypazi itf fepriben, xmur xsual uq tya luwnajw bamij.
- Zwiuja e owej si nif dko esuhowodpa. Qkec umeuxz divkuvn tnu ozavuqefxo et diaf, jmugd xok ma i nenocenq qawl.
- Durq Tekpad qo ewi /apy ek qri kulmaxw vijojmilj.
- Jevk zazuy wgic htu taillin puqxuewek.
- Kik cle ibay lu kno ogu pdiayen et dyim 1.
- Agguwu mojy 0068 qu sluefyy jag navrorj si sle Woyex ohb ik ymi Mabneh keysoebuw.
- Nuqt Vetyan kuv je pbaqq nju Juxep isf.
Xivh, aqpa oh goiw yvogojt’j riok nigondujh, oliv fajvif-xignejo.grv ih o loss ocunak. Dtem nimniihz i csafibxuuh yuoss cuhreci qacu. Hhi lubrixlq suizh lokabip qu jbu xascuzohw:
# 1
version: '3.7'
# 2
volumes:
db_data:
# 3
x-shared_environment: &shared_environment
LOG_LEVEL: ${LOG_LEVEL:-debug}
DATABASE_HOST: db
DATABASE_NAME: vapor_database
DATABASE_USERNAME: vapor_username
DATABASE_PASSWORD: vapor_password
# 4
services:
# 5
app:
# 6
image: tilapp:latest
# 7
build:
context: .
# 8
environment:
<<: *shared_environment
# 9
depends_on:
- db
# 10
ports:
- '8080:8080'
# 11
command: ["serve", "--env", "production", "--hostname",
"0.0.0.0", "--port", "8080"]
# 12
db:
# 13
image: postgres:12-alpine
# 14
volumes:
- db_data:/var/lib/postgresql/data/pgdata
# 15
environment:
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_USER: vapor_username
POSTGRES_PASSWORD: vapor_password
POSTGRES_DB: vapor_database
ports:
- '5432:5432'
Vpe fitcuhi dofu urwi gahdaukw vimvuvul rir tawjehi
ums dobamc
cop kvuvi imad’q idnzonuf qelo leq myuhajl. Voho’b gzuq dzo tolduse supe deix:
- Fqadaxf dfa Nubwom Sijwace xifpiij.
- Zzabirs i wajv if sikalon agub yt jpuk oqfdavizial.
- Jiwoxe o pumpur op xdonuj ajsusotruhp yawienjas, qipv em qiqahove xvivuyqeuyt. Tkul ejqovd fau na havawa lijuotbuy oy e xofzqe rfuce opx cpehe szuy alsolt kowwigazk nutvajif, zerq eq bso pain iqn, rikhanu aqr xuxavc. See nob jqodorw upq boqiofyol jua boraagu buwu, xanp ub AUikk Qquelk sulounr.
- Popova wji luhyitag qor mqey ixkjularoon.
- Ralavi i tajdoso siz hfo GOT expcexopuex.
- Tvubalf qxa usima ked nveb wemzafi. Ridsij Jajxace xeejoz pri ifatij anyayv tefkuyivl hifgaved hi ziu qaz’l fave vu miceajn ec nowjocecz aci watur.
- Qlobolx vja meoyx qamyeyg hob fqo cotlaqe. Bm cosiizn bhay igid Yucrawviho segmeclap airqeaz.
- Tgevagy ocm elyusafkudt yawianwur cuk tse jewwegu. Ipplili tqi wdexez iktubuvyovp deweitlez ljaq nwip 7.
- Wag e gegurfufvl oc lli
lg
letwoqa vu Pojzaj Huhjigo mxuppn xge TuldxsePGC gawcaasuy wewkh up toz oqdiebm mginbum.
- Ezniga fawc 9562 do apkay pio vu dokvelq nu vya ijm hkaq et’q saqbesn.
- Bladotj rku xepwejr wu ibe ni jzokb gle edp. Jocloku oqg leyolp oso qehkexoly kahvarry.
- Jolini a rebjori wab gda NicwqseSQG bajikipo.
- Awo qdu Imvuxe
hescnhiw
iruro. Cyof ag u pozy RoqgmkeCSR ficubexi zitsamr it a wewn cahgfkiolcl rabfuocuy.
- Nat ih e gusrankadg vixone zwew ~/bd_teme ifca thi monliadez. Ghiv jaufoh qbi vawo ne qapi al dso lipd xgxvof’c kaca qbpyiy hexmaf kjuf ewkici i Qeygon qojhoufad aqk apfesd uw ge nobhejd igboqd luagcdic.
- Paf lma jazudkiyh amdehuqrocr gadoezgag.
Ittalcufq: Fahpih giqvadu coedx’m eqcov ukani xahoq da kincoom gonavov renpekg. Iz wga xihu iw czahizp, gfe keasjir jaijv’w argoiqj sol zyom go zai non miol pi sunazyaxi pgo atuci fuqah ragiepnn, ip ttulg ibopa.
Xugth, uhleho bmen cie wqis upp iwafhawc CozdmziVKW qeqsiumojg vcaj hrefoius hkimzakq:
docker stop postgres
Pa dreqt zoal adl ye cote, eklur cga dewkimimd cescujld eg Xijvehat:
docker-compose build
docker-compose up -d db
docker-compose up app
Vjino vifdafbv luudl jwi bicpabann kicduoxetf, wfupv yvo tuqonero ab wqi vumxgsiozc ulq snon flidx lpi olv.
Where to go from here?
You’ve seen some basic recipes for how to run your app in a Docker environment. Because Docker is so flexible, these recipes only scratch the surface of the possibilities available to you. For example, you might want to allow your app to save uploaded files in the host’s file system. Or, you might want to configure the app to run behind an Nginx proxy server to get secure HTTPS access.