docker 安裝 用法

本文記錄 docker 相關知識,以備將來自己查閱

卸載

我電腦裝的是 docker-ce ,所以不能用 remove docker

sudo apt-get remove docker-ce

安裝

ubuntu 安裝

照着上面官網的文檔來。設置倉庫,然後 

sudo apt-get update
sudo apt-get install docker-ce

 

centos 上安裝

https://www.cnblogs.com/yufeng218/p/8370670.html

 

安裝指定版本的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 翻頁按鈕)

https://github.com/moby/moby/releases

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

 

常用用法 

docker -v             顯示docker本身的版本號

docker version    詳細的版本號

 

docker images    顯示所有的 image

docker rmi imageid  刪除指定的 image

docker rmi $(docker images | grep "<none>"| awk '{print $3}')  利用grep  awk 刪除某一些的images

docker tag imageid k8s.gcr.io/k8s-dns-sidecar:1.14.13  添加tag

docker rmi k8s.gcr.io/k8s-dns-sidecar:1.14.13  刪除tag

 

docker ps -h       顯示 ps 的幫助

docker ps           顯示當前正在運行的容器

docker ps -a       顯示所有的docker容器,沒運行的也顯示

docker ps -aq     僅以ID顯示所有容器。 

docker rm $(docker ps -aq)  刪除所有的容器

 

docker run hello-world  運行hello-world

 

設置時區 +  設置共享目錄
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 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中就行了

 

製作容器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 "[email protected]"

#設置工作目錄
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 

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 訪問即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章