docker 安装 用法

14 篇文章 0 订阅
9 篇文章 0 订阅

本文记录 docker 相关知识,以备将来自己查阅

卸载

我电脑装的是 docker-ce ,所以不能用 remove docker

sudo apt-get remove docker-ce

安装

ubuntu 安装

照着上面官网的文档来。设置仓库,然后 

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 上安装

Centos7上安装docker - 风止雨歇 - 博客园

安装指定版本的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 翻页按钮)

Releases · moby/moby · GitHub

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 访问即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值