天天看點

JAVA Go Python PHP 一站式開發環境

作者:簡簡單單程式員

不管是出于學習的目的還是因為公司的項目需要,往往我們需要接觸多種語言的開發環境。問題是如果我們把所有的開發環境都安裝到電腦上,那麼電腦的配置往往跟不上我們開發環境的更新疊代速度。這種情況下我們希望能有一種軟體,確定我們的開發環境穩定,及時更新,并且在不需要的情況下能完全的解除安裝無殘留。Docker完美的符合了我們上述的需求。

問題是Docker的官方鏡像往往是極精簡版本,例如openjdk。這個鏡像裡除了java指令以外什麼都沒有。這種鏡像在生産環境使用中非常的優秀,既穩定又因為體積小有很快的啟動速度。但是在開發時會給我們帶來很大的麻煩。例如我想檢視日志檔案,它沒有tail指令。我想看程序它沒有ps。等等。

這時我們需要自己建立一個屬于我們開發人員的鏡像。

https://gitee.com/fzh-oschina/ubuntu

FROM ubuntu:20.04
LABEL maintainer="[email protected]"
LABEL description="開發使用的ubuntu 鏡像。基于ubuntu:20.04。"

ENV container docker
# -----------------apt配置---------------------------
# RUN rm -rf /etc/apt/sources.list
# ADD apt/20.04.sources.list /etc/apt/sources.list
RUN export DEBIAN_FRONTEND=noninteractive && \
    bash -c 'yes | unminimize'

RUN apt-get update

# -----------------時區配置---------------------------
RUN export DEBIAN_FRONTEND=noninteractive \
    && apt-get install -y tzdata \
    && ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && dpkg-reconfigure --frontend noninteractive tzdata

# -----------------中文---------------------------
RUN apt-get install -y language-pack-zh-hans
ENV LC_ALL zh_CN.UTF-8
ENV LANG zh_CN.utf8
ADD config/bash.bashrc /etc/bash.bashrc

# -----------------中文man---------------------------
RUN apt-get install -y man manpages-zh 
RUN rm -rf /etc/manpath.config 
ADD man/manpath.config /etc

# -----------------系統軟體配置---------------------------
RUN apt-get install -y \
    build-essential \
    gcc \
    g++ \
    gdb \
    clang \
    cmake \
    rsync \
    tar \
    vim \
    automake \
    curl \
    telnet \
    openssl \
    libssl-dev \
    zlib1g-dev \
    libpcre3 \
    libpcre3-dev \
    libgd-dev \
    git \
    net-tools

# -----------------ssh---------------------------
RUN apt-get install -y \
    ssh \
    openssh-client \
    openssh-server

ADD ssh/sshd_config /etc/ssh/sshd_config
RUN chmod 600 /etc/ssh/sshd_config
ADD ssh/ssh_config /etc/ssh/ssh_config
RUN chmod 600 /etc/ssh/ssh_config

ADD .ssh/ /root/.ssh/
RUN chmod 600 /root/.ssh/*
RUN mkdir /run/sshd
EXPOSE 22/tcp
## ------------------------NGINX-------------------------------------
RUN mkdir -p /usr/src/nginx
WORKDIR /usr/src/nginx
RUN curl https://nginx.org/download/nginx-1.16.1.tar.gz -o nginx-1.16.1.tar.gz
RUN curl https://codeload.github.com/fdintino/nginx-upload-module/tar.gz/2.3.0 -o nginx-upload-module-2.3.0.tar.gz
RUN tar -xzvf nginx-1.16.1.tar.gz
RUN tar -xzvf nginx-upload-module-2.3.0.tar.gz
RUN rm -rf nginx-1.16.1.tar.gz
RUN rm -rf nginx-upload-module-2.3.0.tar.gz
WORKDIR /usr/src/nginx/nginx-1.16.1
RUN ./configure \
    --add-module=/usr/src/nginx/nginx-upload-module-2.3.0 \
    --with-http_image_filter_module \
    --with-http_ssl_module \
    --with-stream 
RUN make
RUN make install
RUN mkdir /usr/local/nginx/conf/vhost
RUN mkdir /var/log/nginx/
ADD nginx/ /usr/local/nginx/conf
RUN groupadd www
RUN useradd -g www www-nginx
RUN rm -rf /usr/share/nginx/html/*
EXPOSE 80/tcp

## ------------------------NODEJS-------------------------------------
WORKDIR /tmp
RUN wget https://npm.taobao.org/mirrors/node/v14.18.1/node-v14.18.1-linux-x64.tar.xz
RUN xz -d node-v14.18.1-linux-x64.tar.xz
RUN tar xvf node-v14.18.1-linux-x64.tar
RUN mv /tmp/node-v14.18.1-linux-x64 /usr/local/lib
ENV PATH $PATH:/usr/local/lib/node-v14.18.1-linux-x64/bin
# RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
# RUN npm config set registry https://registry.npm.taobao.org
RUN rm -rf node-v14.18.1-linux-x64.tar
RUN apt install -y yarnpkg

## ------------------------python-------------------------------------
RUN apt install -y python2 python3-pip
RUN mkdir /root/.pip
RUN mkdir /usr/local/python
RUN pip3 install pygments
RUN pip3 install jupyter
RUN pip3 install --upgrade --user nbconvert
ADD ./python/.jupyter/jupyter_notebook_config.py /root/.jupyter/jupyter_notebook_config.py
EXPOSE 8888/tcp

# RUN pip install kafka-python


## ------------------------JAVA-------------------------------------
RUN apt install -y openjdk-8-doc openjdk-8-jdk openjdk-8-jdk-headless
ENV CLASSPATH .:/mnt/develop/jdk/extlib
RUN echo "export CLASSPATH=.:/mnt/develop/jdk/extlib" >> /etc/profile

WORKDIR /usr/lib
ADD java/apache-maven-3.8.1-bin.tar.gz /usr/lib
ENV M2_HOME /usr/lib/apache-maven-3.8.1
RUN echo "export M2_HOME=/usr/lib/apache-maven-3.8.1" >> /etc/profile
ENV PATH $M2_HOME/bin:$PATH
RUN echo "export PATH=\$M2_HOME/bin:\$PATH" >> /etc/profile
ADD java/settings.xml /root/.m2/settings.xml

ADD java/apache-tomcat-8.5.65.tar.gz /usr/lib
ADD java/tomcat/conf /usr/lib/apache-tomcat-8.5.65/conf
ADD java/tomcat/webapps/manager/META-INF/context.xml /usr/lib/apache-tomcat-8.5.65/webapps/manager/META-INF/context.xml
ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.65
RUN echo "export TOMCAT_HOME=/usr/local/apache-tomcat-8.5.65" >> /etc/profile

RUN mkdir /root/bin
WORKDIR /root/bin

RUN curl -L https://alibaba.github.io/arthas/install.sh | sh

RUN mkdir -p /skywalking/agent
ADD java/skywalking-agent/ /skywalking/agent
EXPOSE 8080/tcp
## ------------------------Go-------------------------------------
RUN mkdir -p /usr/local/project/src
# 需要現在下載下傳go的linux版本安裝包到 ./go 目錄下。https://go.dev/dl/  修改下一句的go1.20.5.linux-amd64.tar.gz為下載下傳的go的安裝包名字
ADD go/go1.20.5.linux-amd64.tar.gz /usr/local
ADD go/protoc-3.15.3-linux-x86_64 /usr/local/protoc
ENV PATH=$PATH:/usr/local/go/bin:/usr/local/protoc/bin
RUN echo "export PATH=\$PATH:/usr/local/go/bin:/usr/local/protoc/bin" >> /etc/profile
ENV GOROOT=/usr/local/go
RUN echo "export GOROOT=/usr/local/go" >> /etc/profile
ENV GOPATH=/usr/local/project
RUN echo "export GOPATH=/usr/local/project" >> /etc/profile
WORKDIR /usr/local/project
RUN go env -w GOROOT=/usr/local/go
RUN go env -w GOPATH=/usr/local/project
RUN go env -w GO111MODULE=off
RUN go env -w CGO_ENABLED=0
## go國内代理
RUN go env -w GOPROXY=https://goproxy.cn
## ----------------------Go 第三方依賴 -------------------------------
RUN go get -u github.com/golang/protobuf/protoc-gen-go
# RUN go get github.com/micro/protoc-gen-micro
RUN go get github.com/kardianos/govendor
RUN go get github.com/go-acme/lego/log
RUN go get github.com/olivere/elastic/
RUN go get github.com/go-playground/validator/
RUN go get github.com/go-playground/universal-translator
RUN go get github.com/leodido/go-urn
RUN go get golang.org/x/crypto/sha384
## ----------------------php----------------------------------------

#     php74-php-process.x86_64 \
#     php74-php-pecl-nsq.x86_64 \
#     php74-php-process.x86_64 \
#     php74-php-pdo.x86_64 \
#     php74-php-pecl-redis4.x86_64 \
#     php74-php-pecl-grpc.x86_64 \
#     php74-php-pecl-protobuf.x86_64 \
#     php74-php-pecl-swoole4.x86_64 \
#     php74-php-pecl-yaf.x86_64

# RUN apt -y install software-properties-common
# RUN add-apt-repository ppa:ondrej/php
# RUN apt-get update
# RUN apt -y install php7.4 php7.4-fpm \
#     php7.4-redis \
#     php7.4-bcmath \
#     php7.4-gd \
#     php7.4-json \
# #    php-symfony-process php-mysqlnd-ms-all-dev pd-pdogg mysqlnd pecl-nsq\
#     php7.4-mbstring \
#     php7.4-zip \
#     php7.4-xml \
#     php7.4-soap \
#     php7.4-opcache \
#     php7.4-mysql \

ADD entrypoint.sh /entrypoint.sh
RUN chmod u+x /entrypoint.sh

CMD [ "/bin/sh","/entrypoint.sh" ]

# docker build -t registry.cn-shanghai.aliyuncs.com/fengzhihao/ubuntu:20.04 .

# docker push registry.cn-shanghai.aliyuncs.com/fengzhihao/ubuntu:20.04

# docker run -p 22:22 --rm -it --privileged=true --name ubuntu registry.cn-shanghai.aliyuncs.com/fengzhihao/ubuntu:20.04 /bin/bash           

現有鏡像

如果你本地編譯鏡像比較麻煩可以直接使用這個鏡像。使用此鏡像時需要注意ssh配置

docker run -p 22:22 --rm -it --privileged=true --name ubuntu registry.cn-shanghai.aliyuncs.com/fengzhihao/ubuntu:20.04 /bin/bash           

ssh配置

如果需要啟用ssh。需要生成一個自己的ssh rsa證書并将鏡像中的.ssh删除或者挂在一個本地目錄。

php

php配置還有些不完善的地方是以這個鏡像中沒有配置。 下一篇文章中會有一個Centos的docker鏡像中有php的配置

man的漢化

此鏡像中的指令幫助已經漢化。使用man [指令]即可看到此指令的中文提示

JAVA Go Python PHP 一站式開發環境

時區

此鏡像時區在不做特殊配置情況下永遠是東八區。

nginx

預設nginx版本1.16.1 。更新隻需要更新nginx的url後重新編輯即可

JAVA Go Python PHP 一站式開發環境

支援的開發環境

  1. NODEJS
  2. Python
  3. JAVA
  4. Go

建議

此鏡像在開發測試環境使用比較好。内置多種指令可以快速定位問題。但是鏡像體積較大,傳輸不友善。