本文记录 docker 相关知识,以备将来自己查阅
卸载
我电脑装的是 docker-ce ,所以不能用 remove docker
sudo apt-get remove docker-ce
安装
照着上面官网的文档来。设置仓库,然后
sudo apt-get update
sudo apt-get install docker-ce
源
编辑/etc/docker/daemon.json
{
"registry-mirrors" : [
"http://ovfftd6p.mirror.aliyuncs.com",
"http://registry.docker-cn.com",
"http://docker.mirrors.ustc.edu.cn",
"http://hub-mirror.c.163.com"
],
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"experimental" : true
}
docker root权限
不用每次都 sudo docker
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/json: dial unix /var/run/docker.sock: connect: permission denied
sudo usermod -aG docker 这里写上自己的用户名
sudo chmod a+rw /var/run/docker.sock
centos 上安装
安装指定版本的docker
1.5.2 的kubernete 无法驾驭 我已经装好的 18.09的 docker-ce, 查看 centos 下 docker 版本号 (docker -v) 发现是1.13.1的。
我在ubuntu下安装 1.13.1版本的 docker
卸载原先的,我装的 18.09的ce,需要如下卸载
sudo apt-get purge docker-ce
如果你装的不是ce, 则 sudo apt-get remove docker 应该就可以了
然后到下面这个链接找到适合k8s的发行版本,我要找 1.13.1 的,翻了一页才找到(下面有个 next 翻页按钮)
Linux 64bits tgz: https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
wget https://get.docker.com/builds/Linux/x86_64/docker-1.13.1.tgz
sudo tar --strip-components=1 -xvzf docker-1.13.1.tgz -C /usr/local/bin
常用用法
获取 mysql 8.0 镜像
docker pull mysql/mysql-server:8.0
启动 mysql 8.0 镜像
docker run --name mysql -p 3306:3306 -v /home/wjs/mysqldata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql/mysql-server:8.0
当前运行中的 docker
docker ps
未运行的也显示
docker ps -a
进入容器
docker exec -it containerid /bin/bash
查看ip地址
docker exec -it a cat /etc/hosts
docker inspect 05 | grep IPAddress
显示最后10条日志, 最后10分钟的日志, 一直刷新显示
docker logs ete_appserver_1 --tail=10
docker logs ete_appserver_1 --since=10m
docker logs ete_appserver_1 -f
docker images 所有顶层 images
docker images -a 所有images 包括中级image
给容器发送消息
docker kill -s SIGINT 29ac0449c996
docker rm containerid 删除容器
docker rmi imageid 删除容器镜像,一般只要输入前3个 能区分即可删除
删除所有 <none> image
docker image prune
容器 --> 宿主, 把docker文件拷贝出来
docker cp ci_build_zlgconfd_1:/etc/hosts .
宿主 --> 容器
docker cp /home/wangjunsheng/work/deploy/services_config.json deploy_zlgconfd_1:/usr/src/app/etc
登录docker仓库
docker login -u zycloud -p ZhiyuanCloud1234! ops.zlgcloud.com
打tag
docker tag axpimongo:master ops.zlgcloud.com/zwslib/axpimongo:master
推到仓库中
docker push ops.zlgcloud.com/zwslib/axpimongo:master
设置时区 + 设置共享目录
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime -ti -v ~/go/gopath/src/ete/simulator/bin:/usr/bin/wjs/conf gws
仅设置时区
docker run -v /etc/timezone:/etc/timezone -v /etc/localtime:/etc/localtime gws
设置共享目录
docker run -ti -v ~/go/gopath/src/ete/simulator/bin:/usr/bin/wjs/conf gws
查看容器内时间
docker exec 29ac0449c996 date
进入容器
docker exec -it containerid /bin/bash
docker exec -it containerid bash
拷贝容器的文件
docker cp 161bd2262812:/100Dev.json.data .
给容器发送消息
docker kill -s SIGINT 29ac0449c996
设置时区
ubuntu16.04下 时区是不对的,dokerfile中设置时区方法如下
# 设置时区
# 宿主机的Dockerfile 同目录下 先执行 cp /usr/share/zoneinfo/Asia/Shanghai .
copy Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
总是提示
cp: cannot stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory
应该是 ubuntu 16.04这个docker没搞好。恰好我宿主机也是ubuntu的,于是我直接把宿主机的这个文件 拷贝到 image中就行了
根据pid 反查 归属哪个docker
找到 pid 关联的进程
pstree -p | grep 93316
根据前面查到的关联进程的pid 找出到底是哪个 docker image
docker inspect -f "{{.State.Pid}} {{.Config.Hostname}}" $(docker ps -q) | grep 93316
制作容器1
源码文件: main.go 每2秒显示一行 hello world
// main.go
package main
import (
"fmt"
"os"
"time"
)
func main() {
fmt.Println("args:", os.Args)
for {
fmt.Println("hello world")
time.Sleep(time.Second*2)
}
}
构建出bin文件
go build -o hellogo main.go
注意 go 编译如果使用 apline ,运行 docker 时 为了防止出现 下面错误
standard_init_linux.go:190: exec user process caused "no such file or directory"
编译的时候用下面这个环境变量, 静态链接编译golang程序
export CGO_ENABLED=0
export GO_EXTRA_BUILD_ARGS="-a -installsuffix cgo"
于是当前目录下有2个文件。一个mian.go源码。一个 hellogo bin文件
~/gol/docker $ ls
hellogo main.go
新建 Dockerfile 文件,内容如下
from ubuntu:16.04
COPY hellogo .
ENTRYPOINT ["/hellogo"]
然后运行, -t 指定 image的名字。 注意后面还有个 .
docker build -t hellogo .
运行结果如下
~/gol/docker $ docker run hellogo
args: [/hellogo]
hello world
hello world
-d 可以后台运行 -p 指定暴露的端口号比如 -p 8080:8080 就会把 容器的端口号 暴露到宿主机中 ,这样就可以直接通过宿主机的ip+端口号访问了
docker run -d hellogo
制作容器2
把 go 源码加到image中编译。
#源镜像
FROM golang:latest
#作者
MAINTAINER xx "xx@qq.com"
#设置工作目录
WORKDIR $GOPATH/src/github.com/wjs
#设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone
#将服务器的go工程代码加入到docker容器中
ADD main.go $GOPATH/src/github.com/wjs
#go构建可执行文件
RUN go build .
#最终运行docker的命令
ENTRYPOINT ["./wjs"]
生成 image 并运行
docker build -t hellogo .
docker run hellogo
制作容器3
把编译好的文件加到image中,同时加入一些库函数
这里假定编译好的是gwsim 文件
from ubuntu:16.04
run mkdir /usr/bin/wjs
add gwsim /usr/bin/wjs
WORKDIR /usr/bin/wjs
add lib/ /usr/bin/wjs/lib
#run ls lib
ENV LD_LIBRARY_PATH=lib:$LD_LIBRARY_PATH.
ENTRYPOINT ["/usr/bin/wjs/gwsim"]
docker-compose 示例1
安装compose
下载链接,登录上去看看 当前的版本链接, 我的是ubuntu16.04 所以当前对应的是
https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64
sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64" -o /usr/local/bin/docker-compose
sudo chmod +x docker-compose
// docker-compose 常见用法
docker-compose -f foo.yml up -d
docker-compose -f foo.yml down
拉取镜像
docker-compose -f foo.yml pull
cli.go 编译出 cli
ser.go 编译出 ser
ser cli 各建一个docker,共享redis docker
利用docker-compose 统一管理
gopath 目录下 新建了 http 目录, (不在gopath目录也可以,只要 http 和 其下面的 cli 和 ser目录结构不变即可)
# docker-compose.yml for go simplie client server demo
version: '3'
services:
cli:
build: cli
ser:
build: ser
ports:
- "5555:5555"
redis:
image: "redis:alpine"
新建ser目录 并添加 ser.go 和 Dockerfile
// ser.go
package main
import (
"net/http"
"github.com/gomodule/redigo/redis"
"fmt"
)
type Server struct {
C redis.Conn
}
func (s *Server) Dial() {
if s.C != nil {
return
}
var err error
s.C, err = redis.Dial("tcp", "redis:6379")
if err != nil {
fmt.Println(err)
}
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
if r.URL.Path != "/wjs" {
return
}
s.Dial()
v, err := redis.Int(s.C.Do("get", "hits"))
if err != nil {
v = 1
s.C.Do("set", "hits", 1)
} else {
s.C.Do("set", "hits", v+1)
}
fmt.Fprintf(w, "hello world %d times", v)
}
func (s *Server) Close() {
if s.C != nil {
s.C.Close()
}
}
func main() {
handler := &Server{}
defer handler.Close()
handler.Dial()
err := http.ListenAndServe(":5555", handler)
if err != nil {
fmt.Println(err)
}
}
ser 的 Dockerfile
FROM ubuntu:16.04
COPY ser .
ENTRYPOINT ["/ser"]
新建 cli 目录 并添加 cli.go 和 Dockerfile文件 内容如下
package main
import (
"fmt"
"time"
log "github.com/sirupsen/logrus"
"github.com/gomodule/redigo/redis"
)
func ShowString(cmd, name string, c redis.Conn) (string, error) {
v, err := redis.String(c.Do("get", name))
if (err != nil) {
log.Error(err)
}
log.Print(v)
return v, err
}
func main() {
var c redis.Conn
var err error
for {
c, err = redis.Dial("tcp", "redis:6379")
if (err != nil) {
// log.WithError(err).Error("")
log.Error(err)
} else {
break
}
time.Sleep(time.Second*2)
}
defer c.Close()
for {
time.Sleep(time.Second*3)
ShowString("get", "hits", c)
}
}
FROM ubuntu:16.04
COPY cli .
ENTRYPOINT ["/cli"]
go build cli.go go build ser.go 分别生成 ser 和 cli 文件
然后在 http 目录 运行 docker-compose up
最后通过 http://localhost:5555/wjs 访问即可