Chúng ta đều biết và yêu thích Docker, một nền tảng để tạo, quản lý và phân phối các thùng chứa ứng dụng trên nhiều máy. Docker Inc. cung cấp dịch vụ lưu trữ các thùng chứa nguồn mở sẽ được tải xuống (hoặc kéo) như kho lưu trữ git được gọi là "Docker Registry". Hãy nghĩ về nó giống như một GitHub cho các container Docker.
Nhưng nếu bạn muốn lưu trữ sổ đăng ký của riêng bạn tách biệt với sổ đăng ký công khai thì sao? Chà, Docker Inc. đã mở ứng dụng Registry của họ trên GitHub.
Hướng dẫn này sẽ đưa bạn qua quá trình thiết lập sổ đăng ký Docker riêng bằng CoreOS trên VPS mới.
DockOS + Docker
Chúng tôi sẽ không dành nhiều thời gian để xem chính xác những gì Docker và CoreOS có thể làm, vì nó nằm ngoài phạm vi của hướng dẫn này. Về bản chất, CoreOS được thiết kế cho các cụm máy chủ lớn, nó nhỏ, nhanh và được cập nhật bảo mật thường xuyên. Hệ thống tệp gốc của nó cũng chỉ đọc, nghĩa là bạn phải sử dụng Docker để chạy bất kỳ loại phần mềm nào không có trong bản cài đặt cơ sở.
Điều này làm cho Core OS trở thành một hệ thống máy chủ hoàn hảo cho Docker!
Kéo và chạy registry mới nhất
Docker Inc. đã cung cấp Registry như một hình ảnh cấp cao nhất, điều này có nghĩa là chúng ta có thể kéo nó xuống một cách đơn giản:
docker pull registry
Điều này có thể mất một vài phút tùy thuộc vào tốc độ kết nối.
Điểm cộng của việc là một hình ảnh cấp cao nhất cũng có nghĩa là nó được hỗ trợ và cập nhật thường xuyên.
Bây giờ hãy kiểm tra sổ đăng ký. Chúng tôi có thể tạo một container mới bằng cách sử dụng hình ảnh đăng ký:
docker run -p 5000:5000 -d --name=basic_registry registry
Đối với những người chưa sử dụng Docker quá nhiều, -p
cờ là viết tắt PORT
, có nghĩa là chúng tôi đang hiển thị cổng 5000 trên từ container lên cổng máy chủ 5000.
Các -d
lá cờ tượng trưng cho daemon
, điều này sẽ gây ra các container để chạy ở chế độ nền và không in ra với phiên SSH hiện tại, chúng tôi cũng muốn đặt tên chứa này thử nghiệm cơ bản bằng cách sử dụng --name
tùy chọn để chúng tôi có thể dễ dàng quản lý nó sau này.
Hãy chắc chắn rằng thùng chứa registry cơ bản của bạn đang chạy bằng cách sử dụng docker ps
. Đầu ra sẽ trông tương tự như:
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
Ngoài ra, hãy truy cập http://YOUR_IP:5000
trong trình duyệt web của bạn và bạn sẽ nhận được một thông báo như sau:
"docker-registry server (dev) (v0.8.1)"
Chú ý từ dev
trong ngoặc đơn. Điều này có nghĩa là máy chủ hiện đang chạy cấu hình dev. Chúng tôi sẽ xem xét thêm cấu hình sớm.
Bây giờ bạn có đăng ký container (rất cơ bản) của riêng bạn đang chạy! Nhưng chúng tôi chưa hoàn thành.
Có thể bạn muốn giữ riêng tư này khỏi con mắt tò mò hoặc có thể lưu trữ hình ảnh của bạn trên Amazon S3 thay vì lưu trữ cục bộ. Chúng ta hãy xem qua các tùy chọn cấu hình khác nhau trong phần tiếp theo.
Trước khi chúng ta tiếp tục, hãy tiêu diệt thùng chứa thử nghiệm để chúng ta không chạy vào các cổng xung đột.
docker kill basic_registry
Cấu hình đăng ký
Có hai cách chúng ta có thể chuyển cấu hình cho Docker Registry. Một cách là bằng cách chuyển các biến môi trường sang một thùng chứa mới và cách khác là thêm tệp cấu hình.
Dưới đây là một vài tùy chọn cấu hình phổ biến chúng tôi sẽ sử dụng:
loglevel
- Lượng thông tin tối thiểu để đăng nhập vào bàn điều khiển. Mặc định là info
.
standalone
- Đăng ký này có nên tự hành động không? (Không bao giờ truy vấn sổ đăng ký công khai.) Mặc định là true
.
index_endpoint
- Nếu không độc lập, chúng ta sẽ truy vấn chỉ mục nào khác? Mặc định index.docker.io
.
cache
và cache_lru
- Tùy chọn liên quan đến việc sử dụng bộ đệm Redis cho các tệp nhỏ, chúng ta sẽ chạm vào điều này sau.
storage
- Chúng ta nên sử dụng phụ trợ lưu trữ nào cho máy chủ này? (Trong hướng dẫn này, chúng tôi sẽ sử dụng địa phương).
storage_path
- Nếu sử dụng bộ nhớ cục bộ, chúng ta nên sử dụng thư mục nào để giữ tập tin?
Trước khi chúng tôi làm việc với cấu hình, chúng tôi cần một tệp cơ sở để làm việc. Tệp từ kho lưu trữ Docker Registry trên GitHub sẽ hoạt động tốt:
wget https://raw.githubusercontent.com/docker/docker-registry/0.8/config/config_sample.yml
Các tập tin nên lưu thành công với một đầu ra như:
2014-09-14 14:09:01 (156 MB/s) - 'config_sample.yml' saved [5384/5384]
Tuyệt quá! Bây giờ chúng tôi có thể sửa đổi tập tin này để phù hợp với nhu cầu của chúng tôi.
Trình chỉnh sửa văn bản duy nhất đi kèm với Core OS là vim
, nhưng đừng lo lắng nếu bạn chưa từng sử dụng nó trước đây, điều này sẽ giải thích từng bước cần chỉnh sửa và cách thực hiện.
vim config_sample.yml
Khi bạn mở tệp, nhấn I
và góc dưới bên phải sẽ hiển thị: -- INSERT --
cho chế độ chèn. Cuộn toàn bộ đến cuối tập tin bằng các phím mũi tên của bạn, bạn sẽ thấy một phần có nhãn prod
.
Chúng tôi sẽ thay đổi hai dòng, những thay đổi dưới đây
prod:
<<: *local
storage_path: _env:STORAGE_PATH:/data
Những gì chúng tôi đã làm là thay đổi prod
cấu hình để lấy từ local
phần thay vì s3
phần. Sau đó, chúng tôi ghi đè lên storage_path
để sử dụng đường dẫn /data
bên trong container mới.
Khi bạn đã xác nhận rằng tất cả các thay đổi là chính xác, hãy nhấn ESC
để thoát chế độ chèn và nhập :wq
(điều này có nghĩa là ghi các thay đổi vào tệp và thoát vim.)
Bây giờ hãy đổi tên tập tin thành config.yml
mv config_sample.yml config.yml
Redis bộ nhớ đệm (tùy chọn)
Nếu bạn muốn sử dụng redis để tăng tốc đăng ký container của mình, thì đơn giản như kéo một container mới từ sổ đăng ký công cộng và thêm một vài dòng cấu hình.
Đầu tiên, kéo hình ảnh cấp cao nhất của Redis:
docker pull redis
Khi hình ảnh được kéo thành công, chúng ta có thể chạy nó và đặt tên giống như chúng ta đã làm với sổ đăng ký thử nghiệm:
docker run -d --name registry-redis redis
Vì redis nằm trong bộ nhớ, chúng tôi không cần thực hiện bất kỳ cấu hình nào cho nó, vì chúng tôi sẽ liên kết nó với thùng chứa đăng ký trong các bước sau.
Một lần nữa, đảm bảo nó chạy bằng cách sử dụng 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
Bây giờ mở lại config.yml
trong vim
và nhập chèn chế độ giống như lần đầu tiên chúng tôi sửa nó.
Thêm các dòng sau bên dưới prod
phần, chắc chắn để thụt lề đúng cách. Lần này chúng tôi chỉ thêm cache
và 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
Các biến môi trường REDIS_PORT_6379_TCP_ADDR
và REDIS_PORT_6379_TCP_PORT
được chuyển đến vùng chứa đăng ký khi liên kết với vùng chứa Redis.
Cùng với đó, giờ đây bạn đã thiết lập một thùng chứa Redis sẽ hoạt động song song với thùng chứa đăng ký của bạn. Bây giờ vào việc xây dựng sổ đăng ký!
Xây dựng container
Chúng tôi có tất cả các cấu hình được thiết lập và sẵn sàng, bây giờ chúng tôi cần xây dựng bộ chứa đăng ký thực tế.
vim Dockerfile
Bật lên để tạo Dockerfile mới. Nhập chế độ chèn và làm theo các chỉnh sửa bên dưới.
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
Những gì chúng tôi đã làm ở trên về cơ bản là mở rộng hình ảnh đăng ký để nó sẽ sử dụng tệp cấu hình và cài đặt của chúng tôi. Dockerfile là một tập hợp các hướng dẫn xây dựng để Docker đọc và xây dựng. Nếu bạn muốn tìm hiểu thêm về Dockerfiles và cú pháp của họ, hãy xem tài liệu trang web chính thức của Docker.
Tiếp theo chúng ta cần xây dựng container để sử dụng.
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
Bây giờ chúng tôi đã sẵn sàng để chạy!
Hãy tạo một thư mục trên hệ thống máy chủ của chúng tôi để gắn vào thùng chứa dưới dạng /data
âm lượng.
mkdir registry-data
Bây giờ chúng ta có thể quay lên một container mới. Nếu bạn có kế hoạch sử dụng bộ đệm Redis, hãy sử dụng lệnh thứ 2 bên dưới.
# 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
Để đảm bảo rằng máy chủ của bạn đang chạy chính xác, hãy truy cập http://YOUR_IP:5000
. Bạn sẽ thấy thông báo sau:
"docker-registry server (prod) (v0.8.1)"
Lưu (prod)
ý ý nghĩa thay đổi cấu hình của chúng tôi đã thành công!
Bây giờ chúng tôi có đăng ký đang chạy của riêng mình, chúng tôi muốn máy khách Docker trên các máy cục bộ của chúng tôi bắt đầu sử dụng nó. Thông thường bạn sẽ sử dụng lệnh : docker login
, nhưng để sử dụng, chúng ta cần thêm một đối số nữa vào lệnh đăng nhập:
docker login YOUR_IP:5000
Nhập tên người dùng và mật khẩu (nghĩ về điều này giống như tạo một tài khoản mới) và bỏ qua thông báo cho biết bạn phải kích hoạt nó.
Tiếp theo, hãy kéo một hình ảnh chứng khoán và đẩy nó lên kho lưu trữ của chúng ta.
# 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
Nếu mọi thứ đẩy chính xác, thông báo cuối cùng sẽ nằm dọc theo dòng:
Pushing tag for rev [a9eb17255234] on
Xin chúc mừng! Bạn đã thiết lập kho lưu trữ docker rất riêng của bạn.
Cái gì tiếp theo?
Dưới đây là một số ý tưởng về cách cải thiện sổ đăng ký riêng mới của bạn:
- Đảo ngược proxy bằng Nginx hoặc Apache để đặt bảo mật bổ sung phía trước nó, như xác thực HTTP đơn giản.
- Nhận một tên miền cho máy chủ của bạn và thiết lập nó để bạn có thể truy cập vào sổ đăng ký của mình với một cái gì đó như: registry.mysite.com
- Mua (hoặc tự ký) một chứng chỉ SSL để thêm sự bảo vệ hơn nữa nếu các thùng chứa của bạn chứa thông tin nhạy cảm.