Skip to content

Docker 入门 #74

Description

@nonocast

国内

安装完docker以后,修改docker mirrors

  • macos
    直接在docker preference中docker engine中修改配置
{
  "experimental": true,
  "debug": true,
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "http://hub-mirror.c.163.com"
  ]
}
  • ubuntu
    新建/etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "http://hub-mirror.c.163.com"
  ]
}

重启服务: sudo service docker restart
然后通过验证: docker system info

docker 三大概念

  • image
  • container
  • registry

简单来说,image就是template,然后container就是image的instance,类似class和object的关系,然后registry就是image hub。

从 hello world 开始

~ docker image pull library/hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:49a1c8800c94df04e9658809b006fd8a686cab8028d33cfba2cc049724254202
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
~
~ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        6 months ago        13.3kB

运行image,

~ docker container run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.
..
To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/
~

container运行后就自动结束了,容器会终止,如果是服务类型的,则需要:

  • run: docker container run -it ubuntu bash
  • stop: docker container kill [containID]

注: container run会自动pull对应的image。

~ docker container run -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
3ff22d22a855: Pull complete 
e7cb79d19722: Pull complete 
323d0d660b6a: Pull complete 
b7f616834fd0: Pull complete 
Digest: sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d
Status: Downloaded newer image for ubuntu:latest
root@5ecdd6580d71:/# 
root@5ecdd6580d71:/# ls  
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@5ecdd6580d71:/# 
root@5ecdd6580d71:/# 

再次运行则不会再pull

~ docker container run -it ubuntu bash
root@fecd9bb82810:/# 
root@fecd9bb82810:/# 

Docker 入门教程 - 阮一峰的网络日志

如果你想看看nginx (nginx:stable-alpine没有bash),

~ docker pull nginx
~ docker container run -it nginx bash

system

  • delete all unused objects: docker system prune

image

  • list: docker image ls 或者 docker images
  • delete: docker image rm [id]
  • delete all images: docker rmi -f $(docker images -a -q)
  • delete images (none): docker image prune

container

  • list: docker ps or ``docker container ls`
  • kill: docker kill [containerID]
  • run (新建container): docker container run
  • start: docker container start [containerID]
  • stop: docker container stop [containerID]
  • delete: docker container rm [containerID]
  • logs: docker container logs [containerID]
  • enter: docker exec -it [containerID] bash
docker run --name foo -it ubuntu bash
然后因为没有foreground process,所以退出以后status就改为exit, 如果需要重新进入,
docker attch foo
如果是一次性不需要重入,则docker run的时候加上--rm参数

如果需要给一个已经存在container添加volume则需要commit

$ docker ps  -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED              STATUS                          PORTS               NAMES
    5a8f89adeead        ubuntu:14.04          "/bin/bash"              About a minute ago   Exited (0) About a minute ago                       agitated_newton

$ docker commit 5a8f89adeead newimagename

$ docker run -ti -v "$PWD/dir1":/dir1 -v "$PWD/dir2":/dir2 newimagename /bin/bash

How can I add a volume to an existing Docker container? - Stack Overflow

image, container和文件转换

  • 容器转成镜像:docker commit imagename
  • 容器转成文件: docker export > /home/exportname.tar
  • 镜像转成文件: docker save imagename01 > /home/savename.tar
  • 文件转成镜像: cat /home/exportname.tar | sudo docker import - imagename:latest
  • save.tar文件转成镜像: docker load < /home/savename.tar

实践

react webapp

思路:在ubuntu中build然后将build的内容放到nginx中运行即可

Dockerfile (稍后补上build阶段)

FROM nginx:stable-alpine
COPY build /home/webapp
COPY default.conf /etc/nginx/conf.d/default.conf
WORKDIR /home/webapp
EXPOSE 80

default.conf

server {
  listen 80;
  root /home/webapp;

  location / {
    index index.html;
  }
}

nodejs和react共一个image,这里省略nodejs webpack build和react build过程,

Dockerfile

FROM node:12.6.0-slim

RUN apt-get update && apt-get install -y nginx

COPY webapp/build /home/webapp
COPY service/dist/production /home/service
COPY start.sh /home/start.sh
COPY nginx.conf /etc/nginx/sites-enabled/default

WORKDIR /home/service
RUN npm install

EXPOSE 80 9800

ENTRYPOINT /bin/bash -C '/home/start.sh'

default.conf

server {
  listen 80;

  location / {
    root /home/webapp;
    index index.html;
  }

	location /api/ {
		proxy_pass http://localhost:9800/;
		proxy_read_timeout 300s;
		proxy_send_timeout 300s;

		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Server $host;
	}
}

Docker推荐一个Docker只做一件事,所以接着来看docker-compose的'标准'做法,

docker-compose.yml

version: "3"
services:
  web:
    depends_on:
      - api
    build: webapp
    ports:
      - 80:80

  api:
    build: service
    expose:
      - 9800

说明:

  • services中web, api对应2个image, 等同于将docker run改为配置方式
  • depends_on表示启动顺序
  • expose表示9800暴露给docker compose默认共享网络,而ports则映射到宿主机
  • nginx.conf中api则是在hosts中映射了一个api域名到api container服务

然后修改react中的nginx.conf

server {
  listen 80;

  location / {
    root /home/webapp;
    index index.html;
  }

	location /api/ {
		proxy_pass http://api:9800/;
		proxy_read_timeout 300s;
		proxy_send_timeout 300s;

		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Server $host;
	}
}

docker-compose up运行,但是如果你要更新则需要docker-compose up --build,这里吃了大亏。

以上

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions