Home Docker快速上手
Post
Cancel

Docker快速上手

安装

官网教程安装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 [:] 如果没有会自动帮你pull

-p 9000:80 将宿主机的9000端口映射到容器的80端口上

-v : 将宿主机的src目录或文件夹映射到容器的dest

-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来管理

  1. 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模式

  1. 连接私有docker registry 选择registries,新建一个(如果需要的话),注意dockerhub的官方registry url为registry.hub.docker.com

  2. 使用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

This post is licensed under CC BY 4.0 by the author.

Hive笔记

Docker的一些坑