docker 入门教程

创作人 Leo


编辑时间 Tue Sep 15,2020 at 18:45


docker 常用命令

拉取 centos7 官方仓库:
仓库名:TAG

docker pull centos:centos7

$ docker pull centos:centos7
centos7: Pulling from library/centos
75f829a71a1c: Pull complete 
Digest: sha256:19a79828ca2e505eaee0ff38c2f3fd9901f4826737295157cc5212b7a372cd2b
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
localhost:fabcar bitz$ docker images
REPOSITORY     TAG                 IMAGE ID            CREATED             SIZE
centos         centos7             7e6257c9f8d8        4 weeks ago         203MB
$ docker run -it centos:centos7 /bin/bash
[root@6c169bbc22b7 /]# ls /
anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@6c169bbc22b7 /]# 

启动一个 centos 容器,并进入命令行:

docker run -it centos:centos7 /bin/bash

-d 可以让容器后台运行

docker run -itd centos:centos7 /bin/bash

通过容器 id 进入一个后台运行的容器

docker exec -it 7604afc7b7fb /bin/bash

查看命令帮助:

docker command -help

查看已安装容器

docker images

查看当前运行中容器:

docker ps

停止一个后台容器:

docker kill 7604afc7b7fb

-a 查看全部容器,包含已停止

docker ps -a

localhost:fabcar bitz$ docker ps -a
CONTAINER ID        IMAGE                                                                                                    COMMAND                  CREATED              STATUS                          PORTS                                        NAMES
dce5b934f1fe        centos:centos7                                                                                           "/bin/bash"              About a minute ago   Exited (0) About a minute ago                                                objective_burnell
6c169bbc22b7        centos:centos7                                                                                           "/bin/bash"              30 minutes ago       Exited (0) 8 minutes ago                                                     pensive_lehmann
da7d52b53ec8        dev-peer0.org2.example.com-fabcar-1.0-264b0a1cb5efbecaac5cf8990339c24474dc8435c6e10f10f2be565d555d0e94   "chaincode -peer.add…"   56 minutes ago       Up 56 minutes                                                                dev-peer0.org2.example.com-fabcar-1.0

dce5b934f1fe 这个 centos:centos7 状态为 Exited
通过以下命令可以重启:

docker start dce5b934f1fe


image 命令

images 命令用来查看已下载的镜像

docker images

删除镜像

docker rmi nginx:leo-test-v1


container 命令

container 命令用来管理容器,例如通过镜像启动容器,停止容器,删除

容器停止后默认不会被删除
首先通过 ls 子命令查看所有容器

docker container ls –all

rm 指定容器 id 即可删除该容器

docker container rm bd48608b1c10

或者启动容器时使用 –rm 参数,容器停止后会自动删除

docker container run -p 8000:80 –rm -it nginx:leo-test-v1 /bin/bash


例:通过 docker 运行一个 python3 脚本

首先下载 python

docker pull python:3.6

为了编程方便,我们需要做一个文件夹映射
run -v 可以指定文件映射

docker run -itd -v /Users/xxx/Downloads/dockertest/pytest:/data python:3.6

好了,python docker 容器启动了

下面编写 python 测试脚本

print("hello")

很简单的一个打印,保存为 test.py

通过 docker ps 获取 pyhton 镜像实例化的容器 ID

通过容器执行该脚本

docker exec -it 3487b164235c /usr/local/bin/python /data/test.py


docker file 编写

通过 Dockerfile 定制一个镜像
测试程序以 nginx 为基础,启动一个 docker 版的网站

首先编写 Dockerfile

FROM nginx:1.15.12
COPY ./htmls /usr/share/nginx/html
WORKDIR /usr/share/nginx/html
EXPOSE 80 443
CMD ["bash", "-c", "nginx -g 'daemon off;'"]

非常简单的一个 Dockerfile
FROM 声明基础镜像为nginx,FROM nginx:1.15.12 可以指定镜像标签,不指定默认使用 latest
COPY {src} {dist} src 为本地路径,dist 为容器内路径,这条指令将 src 中的文件拷贝到 dist
WORKDIR 由于有些指令在执行时会新建层,WORKDIR 声明工作目录,只有 WORKDIR 存在于所有层
EXPOSE 声明使用的端口
CMD 执行指令,不同于 RUN 是在 docker build 时运行,CMD 是在 docker run 时运行

创建镜像 docker build
-t 指定镜像的名字,冒号后面是镜像标签

$ docker build -t mywebapp:1.0.0 .
Sending build context to Docker daemon  3.584kB
Step 1/5 : FROM nginx:1.15.12
 ---> 8b309e928cc7
Step 2/5 : COPY ./htmls /usr/share/nginx/html
 ---> 2b27d50b8efb
Step 3/5 : WORKDIR /usr/share/nginx/html
 ---> Running in 900c9c59acec
Removing intermediate container 900c9c59acec
 ---> 1bb4548d102d
Step 4/5 : EXPOSE 80 443
 ---> Running in 257fb567a314
Removing intermediate container 257fb567a314
 ---> 123013f04b83
Step 5/5 : CMD ["bash", "-c", "nginx -g 'daemon off;'"]
 ---> Running in b18dd0b238ba
Removing intermediate container b18dd0b238ba
 ---> 3eb5423a9f0a

通过 docker images 命令查看镜像是否创建成功
可以看到 mywebapp tag 为 1.0.0 已经存在了

$ docker images|grep mywebapp
mywebapp                                                                                                 1.0.0               3eb5423a9f0a        10 minutes ago      133MB

下面通过镜像启动一个容器

$ docker container run -p 8000:80 --rm -itd mywebapp:1.0.0
7604afc7b7fbf265b6e1470c384ef19a32a91491dc3e842000a5787568056c18

–rm 容器停止后删除相关空间,默认不会删除容器,可以再次启动

-itd
-i: 交互式操作
-t: 终端
-d: 后台执行

-p 8000:80 端口映射
将本机 8000 映射到容器的 80 端口


实战1 :通过 docker 运行 golang 项目

步骤简介:
1. 制作go项目 Dockerfile
2. 启动 mysql 容器
3. 导入 mysql 表
4. 启动 && 测试

开始之前我们需要先准备一个 docker + golang 项目

go.mod 文件

module github.com/phpxin/gotestproj

go 1.14

require (
	github.com/go-sql-driver/mysql v1.5.0
	github.com/jinzhu/gorm v1.9.15
)

main.go 文件

package main

import (
	"fmt"
	_ "github.com/go-sql-driver/mysql"
	"github.com/jinzhu/gorm"
)

func main() {
	connstr := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", "root",
		"123456",
		"mysqldb001",
		"3306",
		"test",)

	var err error
	db, err := gorm.Open("mysql", connstr)
	if err!=nil {
		panic(err)
	}

	user := new(UserModel)
	err = user.GetById(db, 1)
	if err!=nil {
		fmt.Println("get user id 1 failed ", err.Error())
	}else{
		fmt.Println("user info", user)
	}
}

models.go 文件

package main

import "github.com/jinzhu/gorm"

type UserModel struct {
	Id int64
	Email string
	updated int64
}

func (t *UserModel) TableName() string {
	return "user"
}

func (t *UserModel) GetById(db *gorm.DB, id int64) error {
	err := db.Where("id=?", id).First(t).Error
	return err
}

把这三个文件保存到 goproj/testproj 下
下面编写 Dockerfile

FROM golang:1.14.9
COPY ./testproj/ /data/testproj
WORKDIR /data/testproj
RUN cd /data/testproj && GOPROXY=https://goproxy.io go build . 

保存为 goproj/Dockerfile

好了,现在我们有了一个 docker + golang 项目
目录结构:

- goproj
-- testproj
--- go.mod
--- main.go
--- models.go
-- Dockerfile

启动 mysql 容器

docker container run \
  -d \
  -p 3308:3306 \
  --rm \
  --name goprojtestdb \
  --env MYSQL_ROOT_PASSWORD=123456 \
  --env MYSQL_DATABASE=test \
  mysql:5.7
```  

导入测试数据   

```sql
CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `email` varchar(45) DEFAULT NULL,
  `updated` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into user(email,updated) values("leo@xx.email", 0) ;

由于我们将本机 3308 端口映射到容器,可以直接在外部通过该端口访问

$ mysql -h 127.0.0.1 -P 3308 -u root -p
...

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> CREATE TABLE `user` (
    ->   `id` int NOT NULL AUTO_INCREMENT,
    ->   `email` varchar(45) DEFAULT NULL,
    ->   `updated` int DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> 
mysql> insert into user(email,updated) values("leo@xx.email", 0) ;
Query OK, 1 row affected (0.01 sec)

生成镜像
进入我们前面创建的 goproj 目录
执行

docker build -t testproj:1.0.0 .

启动一个测试容器

docker container run \
  --rm \
  -itd \
  --name goproj001 \
  --link goprojtestdb:mysqldb001 \
  testproj:1.0.0

通过 exec 连接容器终端,测试

docker exec -it d2b61894e459 /bin/bash

我本机的测试输出:

创建镜像

$ docker build -t testproj:1.0.0 .
Sending build context to Docker daemon  8.287MB
Step 1/4 : FROM golang:1.14.9
 ---> d6747a138341
Step 2/4 : COPY ./testproj/ /data/testproj
 ---> 92f7b0f1d7b6
Step 3/4 : WORKDIR /data/testproj
 ---> Running in 2142638a1c04
Removing intermediate container 2142638a1c04
 ---> 7651dbf90aa0
Step 4/4 : RUN cd /data/testproj && GOPROXY=https://goproxy.io go build .
 ---> Running in 1974d598b3e4
go: downloading github.com/jinzhu/gorm v1.9.15
go: downloading github.com/go-sql-driver/mysql v1.5.0
go: downloading github.com/jinzhu/inflection v1.0.0
Removing intermediate container 1974d598b3e4
 ---> 1aa8adc1e159
Successfully built 1aa8adc1e159
Successfully tagged testproj:1.0.0

查看镜像

$ docker images|grep testproj
testproj                                                                                                 1.0.0               1aa8adc1e159        22 seconds ago      830MB

启动容器

$ docker container run \
>   --rm \
>   -itd \
>   --name goproj001 \
>   --link goprojtestdb:mysqldb001 \
>   testproj:1.0.0
d2b61894e459f98319bea2a5172c87e4931c645a39feab88a8795f5aa30b5cf5

查看容器

$ docker ps|grep testproj
d2b61894e459        testproj:1.0.0      "bash"                   36 minutes ago      Up 36 minutes                                           goproj001

连接到容器进行测试

$ docker exec -it d2b61894e459 /bin/bash
root@d2b61894e459:/data/testproj# ls
go.mod	go.sum	gotestproj  main.go  models.go
root@d2b61894e459:/data/testproj# ./gotestproj 
user info &{1 leo@xx.email 0}

阅读:28
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 1927
  • Mac系统编译PHP7【20190929更新】 1796
  • Windows 安装Swoole 1558
  • Hadoop 高可用集群搭建 (Hadoop HA) 1472
  • Hadoop 高可用YARN 配置 1402
  • 小白鼠问题 1324
  • Hadoop Map Reduce 案例:好友推荐 1267
  • 自动化测试工具 Selenium 1131
  • GIT 分支管理 1064
  • Golang 使用 Grpc 985
简介
不定期分享软件开发经验,生活经验