安装
官网教程安装docker-ce 也可以直接apt安装docker-io(早期版本)
国内修改镜像源
修改或新建/etc/docker/daemon.json
1
2
3
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
这是docker-cn的源,也可以在网上找到网易等 最后重启一下service docker restart
启动一个容器
docker run
-p 9000:80 将宿主机的9000端口映射到容器的80端口上
-v
-it 交互式启动容器
Build一个镜像
首先要编写Dockerfile
1
2
3
4
5
6
7
8
9
10
11
FROM golang # 基础的镜像,由于需要go环境所以用golang,也可用alpine,ubuntu等等
ADD . /usr/local/api_server # 将本机当前文件下下的内容复制到容器的/usr/local/api_server下, 并且还可以复制网络的内容
COPY ./ /usr/local/abc_server # 只能拷贝本机内容到容器目录
# 注意,以上两种复制都可以自动创建文件夹,但是如果源路径为本机的地址的话,必须是当前目录包括子目录,不能用外部目录
WORKDIR /usr/local/api_server # 工作路径,由于我们可能会在刚刚上传的go源代码文件夹下操作,所以可以设置到此,不然在下面的RUN命令需要每一条都cd一下
RUN go build -o my_server # 执行cmd命令(在WORKDIR下或者默认目录)
ENTRYPOINT ["my_server"] # 执行入口
上面是一个最简单的go的dockerfile 然后我们需要build它 在dockerfile的目录下执行docker build -t my_image:v0.0.1
my_image为镜像名, v0.0.1为tag
然后就能在docker images中看见它
docker registry
类似github 可以直接上传镜像 注意: 其实一个docker image的路径是[domain/][namespace/]repository:tag
由于默认是docker hub, 所以可以省略domain, 但是如果需要上传,则需要加上namespace, 但这也是默认上传到docker hub
阿里云 docker registry
https://cr.console.aliyun.com/repository
如使用阿里云的docker registry, 则需要配好命名空间(类似github的用户名,但是一个人最多可以有5个)和仓库 然后登录上传即可
登录 sudo docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
上传 docker push registry.cn-hangzhou.aliyuncs.com/namespace/image:[镜像版本号]
所以如果使用的不是docker hub, image每个字段必须全部写清楚
使用web可视化管理docker
在服务器运行的docker可能很多,如果每次需要重新ssh连接后重新启动,或者服务挂了也需要自己手动重启很是麻烦 所以可以使用portainer.io来管理
- Install
1 2
docker volume create portainer_data docker run -d -p 8000:8000 -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
这是可以看到开了一个volume用于存储portainer的配置,并且传了个
/var/run/docker.sock
容器有了这个就赋予了最高权限可以控制其他容器的启动关闭,这也是这个项目的最重要的基础
登录<服务器ip>:9000, 注册好以后选择local模式服务器ip>
连接私有docker registry 选择registries,新建一个(如果需要的话),注意dockerhub的官方registry url为registry.hub.docker.com
使用Stacks(docker-compose)部署docker容器 编写容器的yaml配置 示例(docker hub私有仓库): ```yaml version: ‘2’ # portainer只支持2版本的docker-compose
services: nginx: # 服务名称,可随便起 image: registry.hub.docker.com/mopip77/giligili:v0.0.1 #镜像地址,如果是dockerhub的private仓库或者第三方registry的需要写全url,如果是dockerhub的官方public仓库则可以省略命名空间 restart: always # 服务挂后重启策略 ports: # 端口映射数组 - 3001:80
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql:
我们知道,docker是最佳实践是无状态的,所以一旦重启,mysql的数据就会丢失,redis同理
我们需要额外配置volume(起名为mysql_data)
```yaml
version: '2'
services:
mysql:
image: mysql
volumes:
- mysql_data:/var/lib/mysql # redis是 /data
environment:
MYSQL_ROOT_PASSWORD: "!uaKhy53$abRzU6t"
restart: always
ports:
- 9006:3306
别忘记mysql8.0更换了密码算法,所以navicat等无法连上,需要docker exec -it mysql_mysql_1 bash
(mysql_mysql_1为运行中的mysql container的名字)进入容器更改数据库, 如何更改见mysql笔记
使用docker容器进程访问另一个docker的mysql
由于是跨docker访问,本质上是无法做到的,但是由于共用了同一台宿主机,所以可以通过暴露mysql docker的端口到宿主机的端口,再让其他docker进程访问宿主机的该端口 注意,此时不能使用127.0.0.1:3306,因为这是docker的本机地址,而不是宿主机的本机地址,所以我们可以通过ifconfig
找到docker0的ip(此ip段用于和容器组网通信),使用此ip即可 如果是服务器的话可以直接使用内网ip 当然服务器也可以将数据库端口暴露在公网上,然后通过公网ip,走一个来回访问到数据库,这样最简单,但是需要暴露数据库,非常非常非常不推荐,我之前用的mongodb就因为暴露在端口并且那个版本有漏洞服务器就被黑了. 不仅是服务,命令行的mysql也能连接mysql -u root -h <docker0_ip | 服务器内网ip> -P <数据库映射到主机的端口号> -p