把docker当作桌面系统来用
Docker简介
解决的痛点:
- 传统的开发,如果需要一个服务部署在多台电脑,需要有多台服务器,以及每次都要重复部署
- 每次重装系统都得配置相应的开发环境
解决方案:
- 虚拟机
- 容器
虚拟机VS容器:
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
存储 | MB | GB |
性能 | 接近原生 | 弱于原生 |
支持数量 | 单机支持上千个容器 | 几十个 |
容器的用途:
- 组建微服务架构:一台机器上可以跑多个容器,每个容器部署服务,模拟微服务的架构
- 整体打包:可以在一台机器上配置不同的平台、环境(软件依赖、系统)进行打包形成容器
- 弹性伸缩:可以在云主机上快速部署容器服务提供更多并发和资源
- 环境一致性:打通开发、测试、生产环境,高度保存一致性,降低意外发生
Docker安装
sudo apt-get install docker
sudo apt-get install docker.io
sudo apt-get install docker-registry
:用来搭建私用仓库(可选)
- 可用
docker version
查看是否安装成功 - 把docker权限给当前用户,否则每次需要权限,
sudo groupadd docker
sudo gpasswd -a ${USER} docker
newgrp docker
- 运行hello-world:官网注册账号,然后登录
docker login
,就可以从docker hub(官网维护的公共仓库)拉取镜像,docker image pull hello-world
docker run hello-world
- 镜像加速:新建或编辑文件
vim /ect/docker/daemon.json
添加以下内容:
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后sudo systemctl daemon-reload
再重启服务sudo systemctl restart docker
,可用docker info
看到有Registry Mirrors:字段改变就行
Docker入门教程
知识
-
三个概念:
镜像(image):给容器运行提供资源,里面包含依赖、程序;image可看做是一个类,Docker利用image生成对象,同一个image可生成多个对象同时运行,
容器:image是静态的,但是运行起来就是容器,是个类创建的实例。
仓库:存放image的地方,我们可以将image上传到仓库,也可从仓库下载。有官方的仓库,本地也有仓库。 -
注意事项
容器运行有自己的存储层,但是生命周期和容器一样,一旦容器消亡,存储层 的数据也消失,所以应该使用数据卷(volume)、或者挂载物理机的目录,这些位置的读写会直接跳过存储层,直接对物理层读写。 -
Client/Server架构
- Client:client通过RESTFUL API发送docker命令到docker daemon进程(Docker后台进程,用于管理镜像,容器以及数据卷),docker daemon进程执行镜像编译,容器启停以及分发,数据卷管理等,一个client可以与多个docker daemon通信、交互
- DOCKER_HOST: 可以在本地,当然也可以在远端服务器上,在host里面有两个重要的东西一个是Image,一个是Containers,
- Registry:用于存储Docker镜像,类似github,公共的Registry有Docker Hub和Docker Cloud。
- Dockerfile文件
用来构建镜像的文件,类似于Makefile,Docker根据Dockfile配置生成image,
- 案例介绍
FROM node:8.4 #该 image 文件继承官方的 node image,冒号表示标签,这里标签是8.4,即8.4版本的,会从官网下载
COPY . /app #将当前目录下的所有文件(除了.dockerignore排除的路径),都拷贝进入 image 文件的/app目录。
WORKDIR /app #指定接下来的工作路径为/app
RUN ["npm", "install", "--registry=https://registry.npm.taobao.org"] #在/app目录下,运行npm install命令安装依赖。注意,安装后所有的依赖,都将打包进入 image 文件。
EXPOSE 3000/tcp #将容器 3000 端口暴露出来, 允许外部连接这个端口。
然后执行:docker image build -t koa-demo:0.0.1 .
-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径。docker image ls
可以看到新生成的image。
然后执行:docker run -p 8000:3000 -it koa-demo:0.01 /bin/bash
,-p参数:容器的 3000 端口映射到本机的 8000 端口。-it参数:容器的 Shell 映射到当前的 Shell,然后你在本机窗口输入的命令,就会传入容器。koa-demo:0.0.1:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。/bin/bash:容器启动以后,内部第一个执行的命令。
可以在Dockfile最后加入 CMD node demos/01.js,表示一启动docker就执行的命令,RUN命令在 image 文件的构建阶段执行,执行结果都会打包进入 image 文件;CMD命令则是在容器启动后执行。另外,一个 Dockerfile 可以包含多个RUN命令,但是只能有一个CMD命令。
常用命令
docker:
- 启动docker服务 :
sudo systemctl start docker
- 终止docker服务:
sudo systemctl stop docker
镜像:
- 搜索相关image:
docker search ubuntu
- 拉取image:
docker image pull hello-world
- 删除image:
docker rmi -f hello-world
- 推送image:
docker push image_name:tag_name
官网得先登录:docker login
- 列出本地image:
docker image ls
- 为镜像设置标签:
docker tag 容器id image_name:tag_name
- 跟新镜像:
docker commit -m "add eigen library" container_id image_id:tag_id
- Dockerfile构建镜像:
docker build -t ubuntu:16.04 path_to_Dockerfile
,-t:指定镜像名。
容器:
- 启动、停止容器:
docker start id
docker stop id
, 或者直接Ctr+d 或者docker kill id
都能退出容器运行 - 查看所有正在运行的容器:
docker ps
或者docker container ls
, -a列出所有包括 终止运行的容器文件,依然会占据硬盘空间, - 删除容器:可以使用
docker container rm id
- 删除所有已停止的容器:
docker container prune
- 利用image启动一个容器:
docker run --rm -it ubuntu:16.04 /bin/bash
,–rm:停止运行后,自动删除容器文件, -i:交互式操作,-t:终端,ubuntu:ubuntu镜像,/bin/bash:传递的命令参数, --volume “$PWD/”:/var/www/html 把当前目录映射到容器的/var/www/html - 多个终端打开docker:找到container id,然后执行
docker exec -it container_id /bin/bash
, 这样就打开了另一个终端,但是如果第一个终端退出,这个也会退出。 另外的方法
Docker Compose
docker compose是docker的官方开源项目,负责容器集群的快速编排。
注意:如果使用的是本地image,docker-compose镜像后面需要加版本,否则会从网上拉取。
- 下载并修改权限:
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- 编辑docker-compose.yaml
tomcat:
version: '3'
services:
tomcat: #服务名称,随意
restart: always # 重启docker时,自动启动相关容器
image: tomcat #使用tomcat镜像, 如果本地没有从网上拉
container_name: tomcat # 容器名,自定义
ports: #映射端口,宿主:docker
- 8080:8080
volumes: # 将宿主机的目录 映射到 docker下目录,这样数据就可以持久保存
- ~/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment: #环境变量
TZ: Asia/Shanghai
mysql:
version: '3'
services:
db:
image: mysql
container_name: mysql
restart: always
environment:
MYSQL_ROOT_HOST: '%'
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: itdragons
MYSQL_USER: itdragons
MYSQL_PASSWORD: 123
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_0900_ai_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ~/docker/mysql/db:/var/lib/mysql
- ~/docker/mysql/conf/my.cnf:/etc/my.cnf
- ~/docker/mysql/init:/docker-entrypoint-initdb.d/
- ~/docker/mysql/sql_backup:/backup
adminer:
image: adminer
container_name: adminer
restart: always
ports:
- 9006:8080
- 通过
docker-compose up -d
和docker-compose down
开启和关闭服务,-d 后台运行。
GitLab
gitlab是一个开源的版本管理系统,实现一个自托管的Git项目仓库。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。下面通过docker来搭建代码托管平台:gitlab
version: '3'
services:
gitlab:
image: 'twang2218/gitlab-ce-zh'
restart: unless-stopped
hostname: '10.28.204.162'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://10.28.204.162:9999'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 9999 #要和ports第一个右边的相同
# 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
# 比如下面的电子邮件的配置:
# gitlab_rails['smtp_enable'] = true
# gitlab_rails['smtp_address'] = "smtp.qq.com"
# gitlab_rails['smtp_port'] = 465
# gitlab_rails['smtp_user_name'] = "9579249@qq.com"
# gitlab_rails['smtp_password'] = "成功开启POP3/SMTP服务后对应的授权码,写入此处"
# gitlab_rails['smtp_authentication'] = "login"
# gitlab_rails['smtp_enable_starttls_auto'] = true
# gitlab_rails['smtp_tls'] = true
# gitlab_rails['gitlab_email_from'] = '9579249@qq.com'
ports:
- '9999:9999'
- '443:443'
- '2222:22'
volumes:
- ~/docker/gitlab/config:/etc/gitlab
- ~/docker/gitlab/data:/var/opt/gitlab
- ~/docker/gitlab/logs:/var/log/gitlab
Nexus
Harbor
禅道
version: '3.1'
services:
zendao:
image: easysoft/zentao:12.5.3 #或者不标明版本取最新,
restart: always
container_name: zendao
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- 9001:80
volumes:
- ~/docker/zentao/app:/www/zentaopms
- ~/docker/zentao/data:/var/lib/mysql
Docker部署WordPress
version: '3.1'
2
3 services:
4
5 wordpress:
6 image: wordpress
7 ports:
8 - 8080:80
9 environment:
10 WORDPRESS_DB_HOST: db
11 WORDPRESS_DB_USER: julian
12 WORDPRESS_DB_PASSWORD: 123456
13 WORDPRESS_DB_NAME: wordpress_db
14 volumes:
15 - ~/docker/wordpress/app:/var/www/html
16
17 db:
18 image: mysql:5.7
19 environment:
20 MYSQL_DATABASE: wordpress_db
21 MYSQL_USER: julian
22 MYSQL_PASSWORD: 123456
23 MYSQL_ROOT_PASSWORD: 123456
24 ports:
25 - 3306:3306
26 volumes:
27 - ~/docker/wordpress/db:/var/lib/mysql