国内
安装完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就是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,这里吃了大亏。
以上
国内
安装完docker以后,修改docker mirrors
直接在docker preference中docker engine中修改配置
新建/etc/docker/daemon.json
{ "registry-mirrors": [ "https://mirror.ccs.tencentyun.com", "http://hub-mirror.c.163.com" ] }重启服务:
sudo service docker restart然后通过验证:
docker system infodocker 三大概念
简单来说,image就是template,然后container就是image的instance,类似class和object的关系,然后registry就是image hub。
从 hello world 开始
运行image,
container运行后就自动结束了,容器会终止,如果是服务类型的,则需要:
docker container run -it ubuntu bashdocker container kill [containID]注: container run会自动pull对应的image。
再次运行则不会再pull
Docker 入门教程 - 阮一峰的网络日志
如果你想看看nginx (nginx:stable-alpine没有bash),
system
docker system pruneimage
docker image ls或者docker imagesdocker image rm [id]docker rmi -f $(docker images -a -q)docker image prunecontainer
docker psor ``docker container ls`docker kill [containerID]docker container rundocker container start [containerID]docker container stop [containerID]docker container rm [containerID]docker container logs [containerID]docker exec -it [containerID] bash如果需要给一个已经存在container添加volume则需要commit
How can I add a volume to an existing Docker container? - Stack Overflow
image, container和文件转换
实践
react webapp
思路:在ubuntu中build然后将build的内容放到nginx中运行即可
Dockerfile (稍后补上build阶段)
default.conf
nodejs和react共一个image,这里省略nodejs webpack build和react build过程,
Dockerfile
default.conf
Docker推荐一个Docker只做一件事,所以接着来看docker-compose的'标准'做法,
docker-compose.yml
说明:
然后修改react中的nginx.conf
docker-compose up运行,但是如果你要更新则需要docker-compose up --build,这里吃了大亏。以上