CoreOS + Docker
Изтегляне и стартиране на най-новия регистър
Конфигурация на системния регистър
Кеширане на Redis (по избор)
Изграждане на контейнера
Конфигурирайте вашия локален клиент на Docker
Какво следва?
Всички познаваме и обичаме Docker, платформа за създаване, управление и разпространение на контейнери за приложения на множество машини. Docker Inc. предоставя услуга за хостване на контейнери с отворен код, които да бъдат изтегляни (или изтегляни) като git хранилище, известно като „Регистър на Docker“. Мислете за него като за GitHub за Docker контейнери.
Но какво ще стане, ако искате да хоствате свой собствен регистър, отделен от публичния? Е, Docker Inc. е с отворен код своето приложение за регистър на GitHub.
Този урок ще ви преведе през процеса на настройка на частен регистър на Docker с помощта на CoreOS на нов VPS.
CoreOS + Docker
Няма да прекарваме много време в разглеждане какво точно могат да направят Docker и CoreOS, тъй като това е извън обхвата на този урок. По същество CoreOS е проектиран за масивни сървърни клъстери, той е малък, бърз и получава редовни актуализации на сигурността автоматично. Неговата основна файлова система също е само за четене, което означава, че трябва да използвате Docker, за да стартирате всякакъв вид софтуер, който не е включен в базовата инсталация.
Това прави Core OS перфектна хост система за Docker!
Изтегляне и стартиране на най-новия регистър
Docker Inc. предостави системния регистър като изображение от най-високо ниво, това означава, че можем да го свалим надолу с просто:
docker pull registry
This can take a few minutes depending on the connection speed.
Плюс това, че е изображение от най-високо ниво, също означава, че получава редовна поддръжка и актуализации.
Сега нека тестваме регистъра. Можем да създадем нов контейнер с помощта на изображението на системния регистър:
docker run -p 5000:5000 -d --name=basic_registry registry
За тези, които не са използвали твърде много Docker, -p
флагът означава PORT
, което означава, че излагаме порт 5000 от контейнера към порт за хост 5000.
В -d
флаг означава daemon
, че това ще доведе до контейнера, за да работи във фонов режим и не се отпечатват изход към текущата SSH сесия, ние също искаме да назовем този основен тест контейнер с помощта на --name
опцията, така че ние можем лесно да го управляват по-късно.
Уверете се, че вашият основен контейнер на системния регистър работи с помощта на docker ps
. Резултатът трябва да изглежда подобно на:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
edfb54e4a8c4 registry:0.8.1 "/bin/sh -c 'exec do 7 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp basic_registry
Освен това посетете http://YOUR_IP:5000
във вашия уеб браузър и трябва да получите съобщение като следното:
"docker-registry server (dev) (v0.8.1)"
Notice the word dev
in the parenthesis. This means that the server is currently running the dev config. We'll look over more configuration soon.
Вече имате свой собствен (много основен) регистър на контейнери! Но още не сме готови.
Може би искате да запазите това поверително от любопитни очи или може би да съхранявате вашите изображения на Amazon S3 вместо в локално хранилище. Нека разгледаме различните опции за конфигурация в следващия раздел.
Преди да продължим, нека убием тестовия контейнер, за да не се сблъскаме с конфликтни портове.
docker kill basic_registry
Конфигурация на системния регистър
Има два начина, по които можем да предадем конфигурация в регистъра на Docker. Единият начин е чрез предаване на променливи на средата към нов контейнер, а другият е да добавите конфигурационен файл.
Ето няколко от често срещаните опции за конфигурация, които ще използваме:
loglevel
- Минималното количество информация за влизане в конзолата. По подразбиране е info
.
standalone
- Трябва ли този регистър да действа самостоятелно? (Никога не прави заявки в публичния регистър.) По подразбиране е true
.
index_endpoint
- Ако не е самостоятелен, какъв друг индекс ще потърсим? по подразбиране index.docker.io
.
cache
и cache_lru
- Опции, отнасящи се до използването на Redis кеш за малки файлове, ще се докоснем до това по-късно.
storage
- Какъв бекенд за съхранение трябва да използваме за този сървър? (В този урок ще използваме local).
storage_path
- Ако използваме локално хранилище, коя директория трябва да използваме, за да съхраняваме файлове?
Преди да започнем работа с конфигурацията, се нуждаем от основен файл, с който да работим. Файлът от хранилището на Docker Registry на GitHub ще работи добре:
wget https://raw.githubusercontent.com/docker/docker-registry/0.8/config/config_sample.yml
Файлът трябва да бъде запазен успешно с изход като:
2014-09-14 14:09:01 (156 MB/s) - 'config_sample.yml' saved [5384/5384]
Страхотен! Сега можем да модифицираме този файл, за да отговаря на нашите нужди.
Единственият текстов редактор, който идва с Core OS, е vim
, но не се притеснявайте, ако никога не сте го използвали преди, това ще обясни стъпка по стъпка какво да редактирате и как да го направите.
vim config_sample.yml
След като отворите файла, натиснете I
и в долния десен ъгъл трябва да се покаже: -- INSERT --
за режим на вмъкване. Превъртете до края на файла с помощта на клавишите със стрелки, трябва да видите секция с етикет prod
.
Ще променим двата реда, промените са по-долу
prod:
<<: *local
storage_path: _env:STORAGE_PATH:/data
Това, което направихме, е да променим prod
конфигурацията, за да произлиза от local
секцията вместо от s3
секцията. След това заменихме, за storage_path
да използваме пътя /data
вътре в новия контейнер.
След като потвърдите, че всички промени са правилни, натиснете, за ESC
да излезете от режима на вмъкване и напишете :wq
(това означава да напишете промените във файла и да излезете от vim.)
Сега нека преименуваме файла на just config.yml
mv config_sample.yml config.yml
Кеширане на Redis (по избор)
Ако искате да използвате redis, за да ускорите вашия регистър на контейнерите, това е толкова просто, колкото да изтеглите нов контейнер от публичния регистър и да добавите още няколко реда конфигурация.
Първо издърпайте изображението от най-високо ниво на Redis:
docker pull redis
След като изображението бъде изтеглено успешно, можем да го стартираме и да го назовем точно както направихме с тестовия регистър:
docker run -d --name registry-redis redis
Тъй като redis е в паметта, не е необходимо да правим никаква конфигурация за него, тъй като ще го свържем с контейнера на системния регистър в следващите стъпки.
Още веднъж се уверете, че работи, като използвате docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
54f65641eccf redis:2.8 "redis-server" 2 seconds ago Up 1 seconds 6379/tcp registry-redis
Сега отворете отново config.yml
in vim
и влезте в режим на вмъкване точно както първия път, когато го редактирахме.
Добавете следните редове под prod
секцията, като се уверите, че сте правилен отстъп. Този път добавяме само cache
и cache_lru
.
cache:
host: _env:REDIS_PORT_6379_TCP_ADDR
port: _env:REDIS_PORT_6379_TCP_PORT
db: 0
cache_lru:
host: _env:REDIS_PORT_6379_TCP_ADDR
port: _env:REDIS_PORT_6379_TCP_PORT
db: 1
Променливите на средата REDIS_PORT_6379_TCP_ADDR
и REDIS_PORT_6379_TCP_PORT
се предават към контейнера на системния регистър при свързване с контейнера Redis.
С това вече сте настроили Redis контейнер, който ще работи ръка за ръка с вашия контейнер на системния регистър. Сега към изграждането на регистъра!
Изграждане на контейнера
Имаме цялата конфигурация и е готова, сега трябва да изградим действителния контейнер на системния регистър.
Пожар vim Dockerfile
да се създаде нов Dockerfile. Влезте в режим на вмъкване и следвайте редакциите по-долу.
FROM registry:latest
# Add the custom configuration file we made
ADD ./config.yml /docker-registry/config/config.yml
# Create the data directory
RUN mkdir /data
# Set the configuration file to config.yml
env DOCKER_REGISTRY_CONFIG /docker-registry/config/config.yml
# Make sure we use the prod configuration settings
env SETTINGS_FLAVOR prod
Това, което направихме по-горе, по същество е да разширим изображението на системния регистър, така че да използва нашия конфигурационен файл и настройки. Dockerfile е набор от инструкции за изграждане, които Docker може да чете и изгражда. Ако искате да научите повече за Dockerfiles и техния синтаксис, разгледайте официалната документация на сайта на Docker.
След това трябва да изградим контейнера за употреба.
docker build -t my_registry .
Sending build context to Docker daemon 13.82 kB
Sending build context to Docker daemon
Step 0 : FROM registry
---> e42d15ec8417
Step 1 : ADD ./config.yml /docker-registry/config/config.yml
---> 4339f026d459
Removing intermediate container 2d5138fbcd34
Step 2 : RUN mkdir /data
---> Running in a090f0bdbfd1
---> 8eb27ba6e12a
Removing intermediate container a090f0bdbfd1
Step 3 : env DOCKER_REGISTRY_CONFIG /docker-registry/config/config.yml
---> Running in 565b5bfb2b22
---> 914462e46dc0
Removing intermediate container 565b5bfb2b22
Step 4 : env SETTINGS_FLAVOR prod
---> Running in 31a92847b851
---> b5949575c374
Removing intermediate container 31a92847b851
Successfully built b5949575c374
Сега сме готови да бягаме!
Нека направим директория в нашата хост система, която да се монтира в контейнера като /data
том.
mkdir registry-data
Сега можем да завъртим нов контейнер. Ако планирате да използвате кеша на Redis, използвайте 2-ра команда по-долу.
# For a non-Redis cache registry
docker run -d -p 5000:5000 -v /home/core/registry-data:/data --name=private_reg my_registry
# For a Redis cached registry (Must have followed Redis Caching section above)
docker run -d -p 5000:5000 -v /home/core/registry-data:/data --name=private_reg --link registry-redis:redis my_registry
За да сте сигурни, че вашият сървър работи правилно, посетете http://YOUR_IP:5000
. Ще видите следното съобщение:
"docker-registry server (prod) (v0.8.1)"
Забележете, че (prod)
промените в конфигурацията ни са били успешни!
Сега, когато имаме собствен работещ регистър, искаме клиентът на Docker на нашите локални машини да започне да го използва. Обикновено бихте използвали командата: docker login
, но за нашата употреба трябва да добавим още един аргумент към командата login:
docker login YOUR_IP:5000
Въведете потребителско име и парола (помислете за това като създаване на нов акаунт) и игнорирайте съобщението, което гласи, че трябва да го активирате.
След това нека изтеглим изображение и го изведем до нашето собствено хранилище.
# Pull the busybox image from the public registry
docker pull busybox
# Tag it with our IP/URL
docker tag busybox YOUR_IP:5000/busybox
# Push it to our newly made registry
docker push YOUR_IP:5000/busybox
Ако всичко е натиснато правилно, окончателното съобщение трябва да бъде по линиите на:
Pushing tag for rev [a9eb17255234] on
Честито! Вие сте настроили свое собствено хранилище на docker.
Какво следва?
Ето някои идеи как да подобрите новия си частен регистър:
- Обратно прокси с помощта на Nginx или Apache, за да поставите допълнителна защита пред него, като обикновено HTTP удостоверяване.
- Вземете домейн за вашия сървър и го настройте, така че да имате достъп до регистъра си с нещо като: registry.mysite.com
- Купете (или сами подпишете) SSL сертификат, за да добавите още повече защита, ако контейнерите ви съдържат чувствителна информация.