创作人 Leo
编辑时间 Tue Sep 15,2020 at 19:51
拉取 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
images 命令用来查看已下载的镜像
docker images
删除镜像
docker rmi nginx:leo-test-v1
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
首先下载 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
通过 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. 制作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}